.NET Framework 3.5のWCFで用いられている種々のシリアライザの中からJSONとXMLのシリアライズについて説明します。
基本的な作業手順は以下の通りです。
- プロジェクト参照にSystem.Runtime.Serialization.dll, System.ServiceModel.Web.dll を追加する。
- シリアライズするデータを格納するクラスを作りSystem.Runtime.Serialization 名前空間内の属性をそのクラスに追加する。
- WCFのシリアライザのインスタンスを作りシリアライズする。
データを格納するクラスを作成する
以下のようにSystem.Runtime.Serialization 名前空間内の二つの属性をそのクラスに追加します。
データを格納するクラスはpublicなクラスとして作成、DataContract属性を付加します。
実際にデータを格納するプロパティも実際にpublicなプロパティとして、get,set両方できるようにします。(こうしないとシリアライズ、デシリアライズができません)追加したプロパティにはDataMember属性を付加します。
using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace JSONSerializeSample { [DataContract(Name="person")] public class Person { public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } [DataMember(Name="first")] public string FirstName { get; set; } [DataMember(Name="last")] public string LastName { get; set; } } [DataContract(Name="persons")] [Serializable] public class Persons { private Listpersons; public Persons() { persons = new List(); persons.Add(new Person("Bob", "Human")); persons.Add(new Person("Tom", "Jackson")); persons.Add(new Person("Jack", "Hamilton")); } [DataMember(Name="personsList")] public IList PersonsList { get { return persons; } set { persons = value.ToList(); } } } }
シリアライズ・デシリアライズ
JSONシリアライズ
DataContractで定義したクラスをシリアライズするにはDataContractJsonSerializerのWriteObjectを使います。デシリアライズル場合はDataContractJsonSerializerのReadObjectを使います。
var serializer = new DataContractJsonSerializer(typeof(Persons)); var ms = new MemoryStream(); serializer.WriteObject(ms, new Persons()); var json = Encoding.UTF8.GetString(ms.ToArray()); MessageBox.Show(json); /* テキストからデシリアライズする。*/ // テキストをUTF8のバイト配列にして、メモリストリームに書き込む byte[] bytes = Encoding.UTF8.GetBytes(json); var ms2 = new MemoryStream(); ms2.Write(bytes, 0, bytes.Length); //以下2行はは確認用 var json2 = Encoding.UTF8.GetString(ms2.ToArray()); MessageBox.Show(json2); //デシリアライズを実行する ms2.Position = 0; //ストリームのポジションを先頭に戻す(忘れちゃだめ) Persons persons = (Persons)serializer.ReadObject(ms2); string firstName = persons.PersonsList[0].FirstName; string lastName = persons.PersonsList[0].LastName; MessageBox.Show(firstName + " " + lastName);
XMLシリアライズ
JSONと違うのは、シリアライザがDataContractSerializerに変わるだけです。
var serializer = new DataContractSerializer(typeof(Persons));//! var ms = new MemoryStream(); serializer.WriteObject(ms, new Persons()); var json = Encoding.UTF8.GetString(ms.ToArray()); MessageBox.Show(json); // テキストからデシリアライズする。 // テキストをUTF8のバイト配列にして、メモリストリームに書き込む byte[] bytes = Encoding.UTF8.GetBytes(json); var ms2 = new MemoryStream(); ms2.Write(bytes, 0, bytes.Length); // デシリアライズを実行する ms2.Position = 0; // ストリームのポジションを先頭に戻す(忘れちゃだめ) Persons persons = (Persons)serializer.ReadObject(ms2); string firstName = persons.PersonsList[0].FirstName; string lastName = persons.PersonsList[0].LastName; MessageBox.Show(firstName + " " + lastName);
コメント