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

  • 2
    いいね
  • 0
    コメント

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

事前準備

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

System.Runtime.Serialization.dll

usingの設定

usingの設定
using System.Runtime.Serialization;
using System.Xml;

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

使用方法

サンプル実装
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出力(本来は1行、見やすいように改行)
<?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>
デバッグ出力
Text : hogetext
IgnoreText : 
ClassText : fugatext

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

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

関連

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

参考

DataContractSerializer クラス (System.Runtime.Serialization)
DataContractSerializerを使って、オブジェクトのXMLシリアル化、逆シリアル化を行う: .NET Tips: C#, VB.NET
neue cc - .NETの標準シリアライザ(XML/JSON)の使い分けまとめ