WCFのサービスで、戻り値や引数に自分で作ったクラスを使うときに、クラスにDataContractとかDataMenber属性をつけたりしないといけない。
これって何だろう??というところから調査スタート。
DataContractSerializer
結論から言うと、DataContract属性やDataMember属性は、DataContractSerializerという新しいクラスで使われるものらしい。
このクラスは、System.Runtime.Serializationを参照に追加することで使えるようになる。
コンソールアプリケーションでDataContractSampleというプロジェクトを作って参照を追加して試してみよう。
まず、いつものPersonクラスを作成する。
この段階では、まだ属性はつけていない。
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
こいつに属性をつけていく。
つける属性は、System.Runtime.Serialization.DataContractとSystem.Runtime.Serialization.DataMemberの2つになる。
DataContractはクラスに、DataMemberはプロパティに付け足す。
[System.Runtime.Serialization.DataContract]
public class Person
{
[System.Runtime.Serialization.DataMember]
public int ID { get; set; }
[System.Runtime.Serialization.DataMember]
public string Name { get; set; }
}
属性をつけたら、以下のようなコードでXML形式へシリアライズできる。
// コンストラクタにターゲットの型を渡す
var ds = new DataContractSerializer(typeof(Person));
// 出力先を作成
var sw = new StringWriter();
var xw = new XmlTextWriter(sw);
// 人間に優しい見た目にして
xw.Formatting = Formatting.Indented;
// いざXMLへ!
ds.WriteObject(xw, new Person { ID = 1, Name = "田中 太郎" });
// 結果確認
Console.WriteLine(sw);
実行結果
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DataContractSample">
<ID>1</ID>
<Name>田中 太郎</Name>
</Person>
ばっちりだ。もちろんXMLからクラスのインスタンスへ復元も可能。
さっきのコードに続けて、以下のようなコードでXMLからオブジェクトのインスタンスへ復元できる。
// デシリアライズ
var sr = new StringReader(sw.ToString());
var xr = new XmlTextReader(sr);
var person = (Person)ds.ReadObject(xr);
Console.WriteLine("ID:{0}, Name:{1}", person.ID, person.Name);
実行結果
ということでDataContractのまとめ。
- DataContractSerializerで使われる
- System.Runtime.Serializationを参照に追加することで使用可能。
- DataContractをクラスへ、DataMemberをプロパティへつける。
- DataContractSerializerのWriteObjectでシリアライズ、ReadObjectでデシリアライズできる
以上、超簡単な使い方でした。