スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

シリアライザ覚書(弐)

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

○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);
}
}
}
}
続きを読む
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

シリアライザ覚書(壱)


 むかーしむかしのWindowsアプリ開発で、外部ファイルにデータを保存する時に最もよく使ったのは、CSV形式だったと記憶している。カンマ区切りかタブ区切りかは、開発者の好みで別れるところだ。たまに固定長で、なんていうのも見かけた。CSVファイルはエクセルに取り込む事もできるので結構便利なんだ。CSVファイルに保存する実装は比較的簡単で、今のC#なら、
var csvText = "..."; //カンマ区切りが好み
System.IO.File.WriteAllText(@"c:\....\dataToSave.csv", csvText);
var dataLines = new List<string> {"..."};
System.IO.File.WriteAllText(@"c:\....\dataToSave.csv",
string.Join(",", dataLines));
になるだろうか。どちらかと言えば、どの項目をどの順番、どういう書式で出力しようかなんていう仕様を決めるのが大変だったと思う。
 他の会社のシステム(アプリケーション)からデータを貰う時もこれが多かった。ただし、そのシンプルさゆえに、ファイルからデータを取り込む時は大変だった。何番目にどんな項目があるかを取り決めた上でプログラムを組み、チェックを行い、エラーになる時はどうするかという仕様を決めていく。なんでこんな仕様?と思っても、ユーザが決めていたりすると、文句は言えても変えることはできない。実際、親方日の丸な組織から送られてくるデータを取り込みたいとき、その形式がまさにCSV形式で、それを取り込む実装をした事がある。その仕様がちゃんと公開されていたので、それほど苦労はしなかったけど。
 それじゃ駄目(このままじゃ駄目)だ!各項目に意味をもたせた方がもっとスムーズになるんだ!という事で生まれたのがXMLだったかな。初めて見た時は、「おー」と思ったものだけど、取り決めだの独自の仕様だの、変換だので、意外に実装は楽にならない。取り込む時だけでなく、出力するときにも気を使う必要があるので、結局大変だった。一体誰の為の仕様なのか、XMLの仕様を策定した人達に聞いてみたい。
 で、現在だと、クラスのシリアライズと逆シリアライズで済ませられる。データクラスのインスタンスをそのままファイルに保存し、必要があれば取り込んで、インスタンスを生成する。Webサービスに使われている技術だ。最近は好んでこれを使っている。だって楽だし。
 最近、作っている(更新し続けている)アプリが、どうも海外拠点でも使い始めたらしく、ユーザさんがパフォーマンスを気にしだした。その調査の一環として調べたのがシリアライザだった。覚書、或いはメモとして書いていく。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。