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