スポンサーリンク

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属性を付加します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Linq;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> System.Runtime.Serialization;
<span class="hljs-keyword">namespace</span> <span class="hljs-title">JSONSerializeSample</span>
{
[<span class="hljs-meta">DataContract(Name=<span class="hljs-meta-string">"person"</span>)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span>
{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> firstName, <span class="hljs-keyword">string</span> lastName</span>)</span> {
<span class="hljs-keyword">this</span>.FirstName = firstName;
<span class="hljs-keyword">this</span>.LastName = lastName;
}
[<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"first"</span>)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> FirstName { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
[<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"last"</span>)</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> LastName { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; }
}
[<span class="hljs-meta">DataContract(Name=<span class="hljs-meta-string">"persons"</span>)</span>]
[<span class="hljs-meta">Serializable</span>]
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Persons</span>
{
<span class="hljs-keyword">private</span> Listpersons;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Persons</span>(<span class="hljs-params"></span>)</span> {
persons = <span class="hljs-keyword">new</span> List();
persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Bob"</span>, <span class="hljs-string">"Human"</span>));
persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Tom"</span>, <span class="hljs-string">"Jackson"</span>));
persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Jack"</span>, <span class="hljs-string">"Hamilton"</span>));
}
[<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"personsList"</span>)</span>]
<span class="hljs-keyword">public</span> IList PersonsList {
<span class="hljs-keyword">get</span> {
<span class="hljs-keyword">return</span> persons;
}
<span class="hljs-keyword">set</span> {
persons = <span class="hljs-keyword">value</span>.ToList();
}
}
}
}
<span class="hljs-keyword">using</span> System.Collections.Generic; <span class="hljs-keyword">using</span> System.Linq; <span class="hljs-keyword">using</span> System.Text; <span class="hljs-keyword">using</span> System.Runtime.Serialization; <span class="hljs-keyword">namespace</span> <span class="hljs-title">JSONSerializeSample</span> { [<span class="hljs-meta">DataContract(Name=<span class="hljs-meta-string">"person"</span>)</span>] <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> { <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> firstName, <span class="hljs-keyword">string</span> lastName</span>)</span> { <span class="hljs-keyword">this</span>.FirstName = firstName; <span class="hljs-keyword">this</span>.LastName = lastName; } [<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"first"</span>)</span>] <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> FirstName { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } [<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"last"</span>)</span>] <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> LastName { <span class="hljs-keyword">get</span>; <span class="hljs-keyword">set</span>; } } [<span class="hljs-meta">DataContract(Name=<span class="hljs-meta-string">"persons"</span>)</span>] [<span class="hljs-meta">Serializable</span>] <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Persons</span> { <span class="hljs-keyword">private</span> Listpersons; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Persons</span>(<span class="hljs-params"></span>)</span> { persons = <span class="hljs-keyword">new</span> List(); persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Bob"</span>, <span class="hljs-string">"Human"</span>)); persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Tom"</span>, <span class="hljs-string">"Jackson"</span>)); persons.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Jack"</span>, <span class="hljs-string">"Hamilton"</span>)); } [<span class="hljs-meta">DataMember(Name=<span class="hljs-meta-string">"personsList"</span>)</span>] <span class="hljs-keyword">public</span> IList PersonsList { <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> persons; } <span class="hljs-keyword">set</span> { persons = <span class="hljs-keyword">value</span>.ToList(); } } } }
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を使います。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var serializer = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DataContractJsonSerializer(<span class="hljs-params">typeof</span>(Persons)</span>);
var ms = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>;
serializer.<span class="hljs-constructor">WriteObject(<span class="hljs-params">ms</span>, <span class="hljs-params">new</span> Persons()</span>);
var json = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms</span>.ToArray()</span>);
MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json</span>)</span>;
<span class="hljs-comment">/* テキストからデシリアライズする。*/</span>
<span class="hljs-comment">// テキストをUTF8のバイト配列にして、メモリストリームに書き込む</span>
byte<span class="hljs-literal">[]</span> <span class="hljs-built_in">bytes</span> = Encoding.UTF8.<span class="hljs-constructor">GetBytes(<span class="hljs-params">json</span>)</span>;
var ms2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>;
ms2.<span class="hljs-constructor">Write(<span class="hljs-params">bytes</span>, 0, <span class="hljs-params">bytes</span>.Length)</span>;
<span class="hljs-comment">//以下2行はは確認用</span>
var json2 = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms2</span>.ToArray()</span>);
MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json2</span>)</span>;
<span class="hljs-comment">//デシリアライズを実行する</span>
ms2.Position = <span class="hljs-number">0</span>; <span class="hljs-comment">//ストリームのポジションを先頭に戻す(忘れちゃだめ)</span>
Persons persons = (Persons)serializer.<span class="hljs-constructor">ReadObject(<span class="hljs-params">ms2</span>)</span>;
<span class="hljs-built_in">string</span> firstName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.FirstName;
<span class="hljs-built_in">string</span> lastName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.LastName;
MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">firstName</span> + <span class="hljs-string">" "</span> + <span class="hljs-params">lastName</span>)</span>;
var serializer = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DataContractJsonSerializer(<span class="hljs-params">typeof</span>(Persons)</span>); var ms = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>; serializer.<span class="hljs-constructor">WriteObject(<span class="hljs-params">ms</span>, <span class="hljs-params">new</span> Persons()</span>); var json = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms</span>.ToArray()</span>); MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json</span>)</span>; <span class="hljs-comment">/* テキストからデシリアライズする。*/</span> <span class="hljs-comment">// テキストをUTF8のバイト配列にして、メモリストリームに書き込む</span> byte<span class="hljs-literal">[]</span> <span class="hljs-built_in">bytes</span> = Encoding.UTF8.<span class="hljs-constructor">GetBytes(<span class="hljs-params">json</span>)</span>; var ms2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>; ms2.<span class="hljs-constructor">Write(<span class="hljs-params">bytes</span>, 0, <span class="hljs-params">bytes</span>.Length)</span>; <span class="hljs-comment">//以下2行はは確認用</span> var json2 = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms2</span>.ToArray()</span>); MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json2</span>)</span>; <span class="hljs-comment">//デシリアライズを実行する</span> ms2.Position = <span class="hljs-number">0</span>; <span class="hljs-comment">//ストリームのポジションを先頭に戻す(忘れちゃだめ)</span> Persons persons = (Persons)serializer.<span class="hljs-constructor">ReadObject(<span class="hljs-params">ms2</span>)</span>; <span class="hljs-built_in">string</span> firstName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.FirstName; <span class="hljs-built_in">string</span> lastName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.LastName; MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">firstName</span> + <span class="hljs-string">" "</span> + <span class="hljs-params">lastName</span>)</span>;
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に変わるだけです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
var serializer = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DataContractSerializer(<span class="hljs-params">typeof</span>(Persons)</span>);<span class="hljs-comment">//!</span>
var ms = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>;
serializer.<span class="hljs-constructor">WriteObject(<span class="hljs-params">ms</span>, <span class="hljs-params">new</span> Persons()</span>);
var json = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms</span>.ToArray()</span>);
MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json</span>)</span>;
<span class="hljs-comment">// テキストからデシリアライズする。</span>
<span class="hljs-comment">// テキストをUTF8のバイト配列にして、メモリストリームに書き込む</span>
byte<span class="hljs-literal">[]</span> <span class="hljs-built_in">bytes</span> = Encoding.UTF8.<span class="hljs-constructor">GetBytes(<span class="hljs-params">json</span>)</span>;
var ms2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>;
ms2.<span class="hljs-constructor">Write(<span class="hljs-params">bytes</span>, 0, <span class="hljs-params">bytes</span>.Length)</span>;
<span class="hljs-comment">// デシリアライズを実行する</span>
ms2.Position = <span class="hljs-number">0</span>; <span class="hljs-comment">// ストリームのポジションを先頭に戻す(忘れちゃだめ)</span>
Persons persons = (Persons)serializer.<span class="hljs-constructor">ReadObject(<span class="hljs-params">ms2</span>)</span>;
<span class="hljs-built_in">string</span> firstName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.FirstName;
<span class="hljs-built_in">string</span> lastName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.LastName;
MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">firstName</span> + <span class="hljs-string">" "</span> + <span class="hljs-params">lastName</span>)</span>;
var serializer = <span class="hljs-keyword">new</span> <span class="hljs-constructor">DataContractSerializer(<span class="hljs-params">typeof</span>(Persons)</span>);<span class="hljs-comment">//!</span> var ms = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>; serializer.<span class="hljs-constructor">WriteObject(<span class="hljs-params">ms</span>, <span class="hljs-params">new</span> Persons()</span>); var json = Encoding.UTF8.<span class="hljs-constructor">GetString(<span class="hljs-params">ms</span>.ToArray()</span>); MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">json</span>)</span>; <span class="hljs-comment">// テキストからデシリアライズする。</span> <span class="hljs-comment">// テキストをUTF8のバイト配列にして、メモリストリームに書き込む</span> byte<span class="hljs-literal">[]</span> <span class="hljs-built_in">bytes</span> = Encoding.UTF8.<span class="hljs-constructor">GetBytes(<span class="hljs-params">json</span>)</span>; var ms2 = <span class="hljs-keyword">new</span> <span class="hljs-constructor">MemoryStream()</span>; ms2.<span class="hljs-constructor">Write(<span class="hljs-params">bytes</span>, 0, <span class="hljs-params">bytes</span>.Length)</span>; <span class="hljs-comment">// デシリアライズを実行する</span> ms2.Position = <span class="hljs-number">0</span>; <span class="hljs-comment">// ストリームのポジションを先頭に戻す(忘れちゃだめ)</span> Persons persons = (Persons)serializer.<span class="hljs-constructor">ReadObject(<span class="hljs-params">ms2</span>)</span>; <span class="hljs-built_in">string</span> firstName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.FirstName; <span class="hljs-built_in">string</span> lastName = persons.PersonsList<span class="hljs-literal">[<span class="hljs-number">0</span>]</span>.LastName; MessageBox.<span class="hljs-constructor">Show(<span class="hljs-params">firstName</span> + <span class="hljs-string">" "</span> + <span class="hljs-params">lastName</span>)</span>;
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をコピーしました