XMLシリアライザの1つです。
DataContractSerialization は .NET Framework 3.0
以降で使用できる標準のクラスです。
標準的な使い方を確認した後、System.Xml のシリアライザとの違いなどを比較していきたいと思います。
コンパイラ : | Visual Studio 2012 | |
OS : | Windows8 64bit 日本語版 | |
参照へ「System.Runtime.Serialization」を追加します。
下図ではバージョンが 4.0.0.0
になっていますが、DataContractSerializationはバージョン3.0から使用できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization; // DataContract, DataMember, DataContractSerializer
namespace test_DataContractSerializer
{
[DataContract]
class Person
{
[DataMember]
public Guid id { set; get; }
[DataMember]
public string name { set; get; }
[DataMember]
public List<string> Hobbies { set; get; }
}
class Program
{
static Person data1;
static Person data2;
static void Main(string[] args)
{
// データを作成
data1 = new Person
{
id = Guid.NewGuid(),
name = "木下英俊",
Hobbies = new List<string>() { "アニメ", "プログラミング", "ジョギング" }
};
// ファイルへ保存
using (var file = System.IO.File.Open("Data.xml", System.IO.FileMode.Create))
{
var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(Person));
serializer.WriteObject(file, data1);
}
// data2 へファイルから読み取り
using (var file = System.IO.File.Open("Data.xml", System.IO.FileMode.Open))
{
var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(Person));
data2 = (Person)serializer.ReadObject(file);
}
// data2 の内容を確認
Console.WriteLine("ID: {0}", data2.id);
Console.WriteLine("name: {0}", data2.name);
Console.Write("hobbies: ");
{
bool bFirst = true;
foreach (string hobbie in data2.Hobbies)
{
if (!bFirst)
{
Console.Write(", ");
}
bFirst = false;
Console.Write("{0}", hobbie);
}
}
Console.WriteLine();
}
}
}
出力結果 "Data.xml"
下記の通りXMLファイルの形式でデータが保存されます。
<Person xmlns="http://schemas.datacontract.org/2004/07/test_DataContractSerializer" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Hobbies xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:string>アニメ</a:string><a:string>プログラミング</a:string><a:string>ジョギング</a:string></Hobbies><id>6677614a-cc29-4b67-969f-9570550c080d</id><name>木下英俊
確かに正しくファイル出力できているものの、1行ですべてが表記されておりとても見にくいです。シリアライズなので必ずしも人が見やすくある必要はありませんが、少々厳しく思います。
System.Xml.Linq.XDocument を使って、改行が入った一般的な形式のXMLファイルを出力するように変更します。
DataContractSerializer の出力先を StringBuilder へ変更。StringBuilder を XmlReader を通じて
XDocument へ読み込ませた後、XDocument からファイルを保存することで一般的なXMLファイルを出力できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization; // DataContract, DataMember, DataContractSerializer
namespace test_DataContractSerializer
{
[DataContract]
class Person
{
[DataMember]
public Guid id { set; get; }
[DataMember]
public string name { set; get; }
[DataMember]
public List<string> Hobbies { set; get; }
}
class Program
{
static Person data1;
static Person data2;
static void Main(string[] args)
{
// データを作成
data1 = new Person
{
id = Guid.NewGuid(),
name = "木下英俊",
Hobbies = new List<string>() { "アニメ", "プログラミング", "ジョギング" }
};
// ファイルへ保存
using (var file = System.IO.File.Open("Data.xml", System.IO.FileMode.Create))
{
StringBuilder sb = new StringBuilder();
using (var tmpFile = System.Xml.XmlWriter.Create(sb))
{
var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(Person));
serializer.WriteObject(tmpFile, data1);
}
using (var tmpFile = System.Xml.XmlReader.Create(new System.IO.StringReader(sb.ToString())))
{
System.Xml.Linq.XDocument xDocument = System.Xml.Linq.XDocument.Load(tmpFile);
xDocument.Save(file);
}
}
// data2 へファイルから読み取り
using (var file = System.IO.File.Open("Data.xml", System.IO.FileMode.Open))
{
var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(Person));
data2 = (Person)serializer.ReadObject(file);
}
// data2 の内容を確認
Console.WriteLine("ID: {0}", data2.id);
Console.WriteLine("name: {0}", data2.name);
Console.Write("hobbies: ");
{
bool bFirst = true;
foreach (string hobbie in data2.Hobbies)
{
if (!bFirst)
{
Console.Write(", ");
}
bFirst = false;
Console.Write("{0}", hobbie);
}
}
Console.WriteLine();
}
}
}
出力結果 "Data.xml"
<?xml version="1.0" encoding="utf-16"?> <Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/test_DataContractSerializer"> <Hobbies xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> <d2p1:string>アニメ</d2p1:string> <d2p1:string>プログラミング</d2p1:string> <d2p1:string>ジョギング</d2p1:string> </Hobbies> <id>71df2330-b675-4eec-b101-d5de26f891a9</id> <name>木下英俊 </Person>
本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。
2023-09-17 | - | ページデザイン更新 |
2019-02-12 | - | 参考を追記 |
2012-12-12 | - | 新規作成 |