シリアライザ覚書(弐)

シリアライザ覚書(壱)の続き。各シリアライザを使って、シリアライズ用とデシリアライズ用のメソッドを実装した。

○XmlSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(Xml)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByXml<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

using (fileStream) {
serializer.Serialize(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(Xml)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>デシリアライズ済オブジェクト</returns>
private static T DeserializeByXml<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

using (fileStream) {
return (T)serializer.Deserialize(fileStream);
}
}
}
}
ファイルチェック無し。try/catch無しの最低限実装。以下も同じ。

○DataContractSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(DataContract)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByDataContract<T>(T obj, string filePath) {

var serializer = new DataContractSerializer(typeof(T));
var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(DataContract)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByDataContract<T>(string filePath) {

var serializer = new DataContractSerializer(typeof(T));
var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}

○DataContractJsonSerializer

using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(Json)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByJson<T>(T obj, string filePath) {

var serializer = new DataContractJsonSerializer(typeof(T));
var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(Json)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByJson<T>(string filePath) {

var serializer = new DataContractJsonSerializer(typeof(T));
var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}

○ProtoBuf.Serializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(ProtoBuf)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByProtoBuf<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);

using (fileStream) {
ProtoBuf.Serializer.Serialize(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。(ProtoBuf)
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByProtoBuf<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);

using (fileStream) {
return (T)ProtoBuf.Serializer.Deserialize<T>(fileStream);
}
}
}
}

○ProtoBuf.ServiceModel.XmlProtoSerializer
using System;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public class Serializers {

/// <summary>
/// 対象オブジェクトをファイルへシリアライズします。(ProtoBuf.ServiceModel)
/// </summary>
/// <param name="obj">対象オブジェクト</param>
/// <param name="filePath">ファイルパス</param>
private static void SerializeByProtoBufSrvModel<T>(T obj, string filePath) {

var fileStream = System.IO.File.Create(filePath);
var serializer = new ProtoBuf.ServiceModel.XmlProtoSerializer(
ProtoBuf.Meta.TypeModel.Create(), typeof(T));

using (fileStream) {
serializer.WriteObject(fileStream, obj);
}

return;
}

/// <summary>
/// 対象ファイルからオブジェクトをデシリアライズします。
/// </summary>
/// <param name="filePath">ファイルパス</param>
/// <returns>オブジェクト</returns>
private static T DeserializeByProtoBufSrvModel<T>(string filePath) {

var fileStream = System.IO.File.OpenRead(filePath);
var serializer = new ProtoBuf.ServiceModel.XmlProtoSerializer(
ProtoBuf.Meta.TypeModel.Create(), typeof(T));

using (fileStream) {
return (T)serializer.ReadObject(fileStream);
}
}
}
}
シリアライズ対象クラス
namespace TawamureDays {

/// <summary>
/// シリアライズ対象用クラス
/// </summary>
[DataContract()]
[ProtoBuf.ProtoContract(UseProtoMembersOnly=false)]
public class TwClass1 {

#region コンストラクタ

/// <summary>
/// コンストラクタ
/// </summary>
public TwClass1() {
this.Text = string.Empty;
this.Date = DateTime.Today;
return;
}

#endregion

#region プロパティ

/// <summary>文字列</summary>
[DataMember(Order=1)]
public string Text { get; set; }

/// <summary>整数値</summary>
[DataMember(Order=2)]
public int Integer { get; set; }

/// <summary>数値</summary>
[DataMember(Order=3)]
public decimal Numeric { get; set; }

/// <summary>日付</summary>
[DataMember(Order=4)]
public DateTime Date { get; set; }

#endregion
}
}
シリアライズしてみる。
namespace TawamureDays {

class Program {

public static void Main(string[] args) {

var targetObj = new TwClass1 {
Text = "シリアライズされます。",
Integer = 1001,
Numeric = 123.4567m,
Date = DateTime.Today.AddDays(1)
};

Serializers.SerializeByXml(targetObj, "TwClass1.xml");
Serializers.SerializeByDataContract(targetObj, "TwClass1.dc.xml");
Serializers.SerializeByJson(targetObj, "TwClass1.json");
Serializers.SerializeByProtoBuf(targetObj, "TwClass1.bin");
Serializers.SerializeByProtoBufSrvModel(targetObj, "TwClass1.protobuf.xml");

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

出力結果はこんな感じ
○TwClass1.xml

<?xml version="1.0"?>
<TwClass1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Text>シリアライズされます。</Text>
<Integer>1001</Integer>
<Numeric>123.4567</Numeric>
<Date>2014-10-26T00:00:00+09:00</Date>
</TwClass1>


○TwClass1.dc.xml

<TwClass1 xmlns="http://schemas.datacontract.org/2004/07/TawamureDays"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Text>シリアライズされます。</Text>
<Integer>1001</Integer>
<Numeric>123.4567</Numeric>
<Date>2014-10-26T00:00:00+09:00</Date>
</TwClass1>


○TwClass1.json

{"Text":"シリアライズされます。","Integer":1001,"
Numeric":123.4567,"Date":"\/Date(1414249200000+0900)\/"}


○TwClass1.bin

0A21E382B7E383AAE382A2E383A9E382A4E382BAE38195E3828CE381BEE38199E3808210E9071A060887AD4B1808220408E2FF01


○TwClass1.protobuf.xml

<proto>CiHjgrfjg6rjgqLjg6njgqTjgrrjgZXjgozjgb7jgZnjgIIQ6QcaBgiHrUsYCCIECOL/AQ==</proto>


その参に続く
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m