DataContractSerialization

XMLシリアライザの1つです。
DataContractSerialization は .NET Framework 3.0 以降で使用できる標準のクラスです。
標準的な使い方を確認した後、System.Xml のシリアライザとの違いなどを比較していきたいと思います。

 

 

 

[環境]

コンパイラ : Visual Studio 2012  
OS : Windows8 64bit 日本語版  

 

 

1.DataContractSerialization によりファイル保存

参照へ「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行ですべてが表記されておりとても見にくいです。シリアライズなので必ずしも人が見やすくある必要はありませんが、少々厳しく思います。

 

2.一般的なXMLファイル形式で保存する

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 ライセンスで提供されます。

The MIT License (MIT)

  Copyright 2012 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 


参考

 


 

変更履歴

2023-09-17 - ページデザイン更新
2019-02-12 - 参考を追記
2012-12-12 - 新規作成

 

Programming Items トップページ

プライバシーポリシー