スポンサーサイト

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

DynamicJSONとProtoBufのシリアライズの違い

DynamicJSONとProtoBufを併用していると、シリアル化時にProtoBufではシリアル化したいがDynamicJSONではシリアル化したくないとき(あるいはその逆)がたまにある。DynamicJSONのリファレンスを見てもシリアル化したくないときにどういう属性をつければいいかが掲載されていなかったので考えてみた。

・DynamicJSONではシリアル化したいが、ProtoBufではシリアル化したくないとき
object型のプロパティなど、ProtoBufでシリアル化できないものが使用例。どちらのライブラリもプロパティに対してシリアル化するのは共通。これは簡単で、ProtoBufではシリアル化有無の属性があるので、[ProtoMember(x)] (※x = 1, 2, …)の属性を外せば良い。

・DynamicJSONではシリアル化したくないが、ProtoBufではシリアル化したいとき
問題はこっちで、データオブジェクトやプログラムの内部的な処理では使っているが、JSONのシリアル化には出力したくないプロパティをどうするかという話。ちゃんとした方法があるのかもしれないけど、DynamicJSONでシリアル化したくないプロパティの修飾子をpublicからinternalに変更したら対応したらできた。DynamicJSONはpublicのプロパティに対してシリアル化をしているらしい。

サンプルコード

public class ConsoleApplication
{
public static void Main()
{
DataObject d = new DataObject() { ShowObject = "foo", DoNotShowObject = "bar", field = "hoge" };
//dを表示
Console.WriteLine("--d : Display");
d.Display();
//JSONにパース
string x = DynamicJson.Serialize(d);
//JSONを表示
Console.WriteLine("--d : JSON");
Console.WriteLine(x);
//ProtoBufでシリアライズ
using (FileStream fs = new FileStream("hoge.dat", FileMode.Create, FileAccess.Write))
{
Serializer.Serialize(fs, d);
}
//ProtoBufでデシリアライズ
DataObject d2;
using (FileStream fs = new FileStream("hoge.dat", FileMode.Open, FileAccess.Read))
{
d2 = Serializer.Deserialize(fs);
}
//デシリアライズされたものの表示
Console.WriteLine("--d2 : Display");
d2.Display();
//デシリアライズされたものをJSONに変換し表示
string x2 = DynamicJson.Serialize(d2);
Console.WriteLine("--d2 : JSON");
Console.WriteLine(x2);
}
}

[ProtoContract]
public class DataObject
{
[ProtoMember(1)]
public string ShowObject { get; set; }
[ProtoMember(2)]
internal string DoNotShowObject {get; set;}

public void Display()
{
Console.WriteLine("ShowObject = {0}, DoNotShowObject = {1}, Field = {2}", ShowObject, DoNotShowObject, field);
}

public string field;
}


出力結果
2014-12-27 023348
スポンサーサイト
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。