スポンサーリンク

WCFのDataContractを使ったデータのシリアライズ

.NET Framework 3.5のWCFで用いられている種々のシリアライザの中からJSONとXMLのシリアライズについて説明します。

基本的な作業手順は以下の通りです。

  1. プロジェクト参照にSystem.Runtime.Serialization.dll, System.ServiceModel.Web.dll を追加する。
  2. シリアライズするデータを格納するクラスを作りSystem.Runtime.Serialization 名前空間内の属性をそのクラスに追加する。
  3. 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);

コメント

タイトルとURLをコピーしました