LoginSignup
2
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-27

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)の使い分けまとめ

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6