[C#][.NET][XML] オブジェクトのシリアライズ/デシリアライズ(DataContractSerializerの使用方法)

C#.NETでのDataContractSerializerの使用方法のメモ

# 事前準備
「参照の追加」から以下が追加されていることを確認すること

System.Runtime.Serialization.dll

# usingの設定

```csharp:usingの設定
using System.Runtime.Serialization;
using System.Xml;
```

DataContractJsonSerializer等でJSONにも出力できるらしいが、今回は標準のXMLを使用した。

# 使用方法

```csharp:サンプル実装
using System;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

namespace ConsoleApplication1
{
    public class Fuga
    {
        public string ClassText;
    }

    [DataContract]
    public class Hoge
    {
        [DataMember]
        public string Text;

        public string IgnoreText;

        [DataMember]
        public Fuga fuga { get; set; } = new Fuga();
    }

    public class XMLSerializer<Type>
    {
        private string fileName;

        public XMLSerializer(string fileName)
        {
            this.fileName = fileName;
        }

        public void Write(Type obj)
        {
            var serializer = new DataContractSerializer(typeof(Type));
            var settings = new XmlWriterSettings();
            settings.Encoding = new UTF8Encoding(false);

            using (var xw = XmlWriter.Create(fileName, settings))
            {
                serializer.WriteObject(xw, obj);
            }
        }

        public Type Read()
        {
            var serializer = new DataContractSerializer(typeof(Type));

            using (var xr = XmlReader.Create(fileName))
            {
                return (Type)serializer.ReadObject(xr);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string fileName = @"test.xml";

            var obj = new Hoge();
            obj.Text = "hogetext";
            obj.IgnoreText = "ignoretext";
            obj.fuga.ClassText = "fugatext";

            var serializer = new XMLSerializer<Hoge>(fileName);

            serializer.Write(obj);

            Hoge readobj = serializer.Read();

            Debug.WriteLine($"{nameof(readobj.Text)} : {readobj.Text}");
            Debug.WriteLine($"{nameof(readobj.IgnoreText)} : {readobj.IgnoreText}");
            Debug.WriteLine($"{nameof(readobj.fuga.ClassText)} : {readobj.fuga.ClassText}");
        }
    }
```

```xml:XML出力(本来は１行、見やすいように改行）
<?xml version="1.0" encoding="utf-8"?>
<Hoge xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1">
  <Text>hogetext</Text>
  <fuga>
    <ClassText>fugatext</ClassText>
  </fuga>
</Hoge>
```

```console:デバッグ出力
Text : hogetext
IgnoreText : 
ClassText : fugatext
```

これにより以下が確認できた。

+ XMLにシリアライズ、XMLからのデシリアライズができること
+ [DataMember]を付けていない、IgnoreTextがシリアライズの対象となっていないこと（デシリアライズ時にはnullになる）
+ 対象内で使用しているクラス（例ではFugaクラス）には [DataMenber] 等は指定しなくてよいこと

# 関連
[[C#][.NET][JSON] オブジェクトのシリアライズ/デシリアライズ(Json.NETの使用方法) - Qiita](http://qiita.com/koara-local/items/f9e2f870ddd315e53545)

# 参考
[DataContractSerializer クラス (System.Runtime.Serialization)](https://msdn.microsoft.com/ja-jp/library/system.runtime.serialization.datacontractserializer(v=vs.110).aspx)
[DataContractSerializerを使って、オブジェクトのXMLシリアル化、逆シリアル化を行う: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/datacontractserializer.html)
[neue cc - .NETの標準シリアライザ(XML/JSON)の使い分けまとめ](http://neue.cc/2011/12/10_357.html)