.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();
}
}
}
}
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();
}
}
}
}
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);
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);
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);
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);
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);
コメント