プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 No.121-Serialize(2)

2007/03/20

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    【ポコカ】がおサイフ携帯の新しい利用方法を提案します。

  お店のクーポン・会員カード・スタンプカードをケータイにひとまとめ

         ☆ おサイフケータイとお店をつなげるポータルサイト ☆
           Pococa!(R)ポコカ URL: http://www.pococa.com/ct/
---------------------------------------------------------------------

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━┳━┳━┓
┃☆┃ C#プログラミングレッスン                         ┃_┃□┃×┃
┣━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━┻━┻━┫
┃シリアル化(SOAP形式)                                    No.121┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

前回に引き続き、シリアル化について説明します。今回は、SOAP 形式のシリア
ル化です。


■──────────────────────────────────
■ SoapFormatter

Soap形式でオブジェクトをシリアル化するには、SoapFormatterを使います。
使い方は、system.runtime.serialization.formatters.soap.dll を参照設定し、
上記コードの BinaryFormatter 部分 SoapFormatter に変えるだけです。

using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;

[Serializable]
public class MyClass {
  public int num = 0;
   public double real = 0;
   public String str = null;
}

...
  // シリアル化
  MyClass obj = new MyClass();
  obj.num = 123;
  obj.real = 456.78;
  obj.str = "foge foge";
  IFormatter formatter = new SoapFormatter();
  Stream stream = new FileStream("MyObject.xml", FileMode.Create,
                 FileAccess.Write, FileShare.None);
  formatter.Serialize(stream, obj);
  stream.Close();

 ...

  // 逆シリアル化
  IFormatter formatter = new SoapFormatter();
  Stream stream = new FileStream("MyObject.xml", FileMode.Open, 
                         FileAccess.Read, FileShare.Read);
  MyClass obj = (MyClass)formatter.Deserialize(stream);
  stream.Close();

  Console.WriteLine("n1: {0}", obj.num);
  Console.WriteLine("n2: {0}", obj.real);
  Console.WriteLine("str: {0}", obj.str);

実際に、シリアル化されたファイルを開いてみると、以下のようなファイルが
作成されているのが確認できると思います。

<SOAP-ENV:Envelope 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
  xmlns:xsd="http://www.w3.org/2001/XMLSchema
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/
  xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:MyClass id="ref-1"     
  xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SampleApp
/SampleApp%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20  
PublicKeyToken%3Dnull">
<num>123</num>
<real>456.78</real>
<str id="ref-3">foge foge</str>
</a1:MyClass>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

※都合で途中で改行しています。

◆注意◆
SoapFormatter では、異なる .NET Framework バージョン間におけるシリアル
化の互換性はサポートされません。Framework のバージョン 1.1 とバージョン
2.0 との間で型をシリアル化した場合、エラーが発生する場合があります。


■──────────────────────────────────
■ 選択的シリアル化 

クラスにはシリアル化されないようにする必要のあるフィールドが含まれてい
る場合があります。たとえば、クラスのメンバ変数にファイルハンドルやスレ
ッド ID を格納する場合は、これらの値を逆シリアル化しても意味がありませ
ん。このような場合には、NonSerialized 属性を使用します。

[Serializable]
public class MyObject {
  public int num = 0;
   [NonSerialized] 
   public double real = 0;
   public String str = null;
}

このように、NonSerialized 属性がついたフィールドは、シリアル化対象から
はずれます。

┌─┬─────────────────────────┬─┬─┬─┐
│☆│ C#プログラミングレッスン  (ぼぼ週刊)            │_│□│×│
├─┴─────────────────────────┴─┴─┴─┤
│ Published by Gushwell.                                           │
│ Copyright (C) 2004-2007 Gushwell All rights reserved.            │
│ Microsoft MVP Visual Developer - Visual C#(Apr 2006 - Mar 2007)  │
│-------------------- Gushwell's Page ---------------------------- │
│ 窓際プログラマーの独り言  :http://blog.livedoor.jp/gushwell/    │
│ 窓際プログラマーの読書三昧:http://gushwell.jugem.jp/            │
│ C#デザインパターン :                                             │
│  『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』  │
│   のサンプルコードをC#に移植したものを掲載しています。           │
│   移植後のコードの公開は、結城氏の了解を得ています。             │
│   http://blog.livedoor.jp/gushwell/archives/50333227.html        │
└─────────────────────────────────┘

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。