2016-04-06 5 views
0

私はシリアル化されたオブジェクトの複数のチャンクにわたってオブジェクト参照を追跡したいと思います。私が知っているシリアライザは参照を追跡できますが、グラフ全体を一度にシリアライズするだけです。私は部分的にグラフをシリアライズし、後でそれを別の部分にシリアル化したり、グラフからいくつかのオブジェクトを更新したりしたい。ストリーム間で参照トラッキングをサポートする.netのシリアライゼーションシステムはありますか?

以下のコードは私の問題を非常によく説明していると思います。ここで使用されている場合、「成功」を印刷するシリアライザを探しています。

[Serializable] 
class TestClass 
{ 
    public string Identifier; 
    public TestClass Reference; 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     //some test data 
     TestClass t1 = new TestClass(); 
     t1.Identifier = "t1"; 
     TestClass t2 = new TestClass(); 
     t2.Reference = t1; 
     t2.Identifier = "t2"; 

     BinaryFormatter formatter = new BinaryFormatter(); //replace this with something that works ^^ 
     MemoryStream stream = new MemoryStream(1024); 
     formatter.Serialize(stream, t1); 
     //possibly do lots of things inbetween these two, including, 
     //but not limited to, switching streams, writing other things 
     //on the stream etc. 
     formatter.Serialize(stream, t2); 
     stream.Position = 0; 
     object copy1 = formatter.Deserialize(stream); 
     object copy2 = formatter.Deserialize(stream); 
     if (((TestClass)copy2).Reference == copy1) 
     { 
      Console.WriteLine("Success"); 
     } 
     else 
     { 
      Console.WriteLine("Failure"); 
     } 
     Console.ReadLine(); 
    } 
} 

私の使用例は、ネットワーク経由でオブジェクトを送信し、参照をそのまま維持したい場合です。私はprotobuf-netを調べて、この問題を回避する方法を書いていますが、複雑さの面で手を抜いています。私の質問は:(良い)シリアライゼーションライブラリは、私はdeserializationメソッドの1回の呼び出しで参照を追跡することができますか?あるいは、私は既存のシリアライザでこれを実現する簡単なテクニックが欠けていますか?あるいは私は自分でこのようなことを書かなければならないのですか?

EDIT:説明:これはゲームのネットワーキングであり、速度とコンパクトさが問題となります。つまり、XML/JSONシリアライザはかなり悪い選択肢です。

答えて

1

DataContractsはこの機能を提供できます。基本的には、クラスを[DataContract(IsReference=true)]で飾るでしょう。また、DataContractsについての良いニュースは、既定でWCFに焼き込められていることです。そのため、プロジェクトに沿ったコミュニケーションレイヤーが既に用意されています。

詳細については、この質問を参照してください。

Circular references preventing serialization of object graph

そしてここでは、MSDNのサイトにいくつかのより多くの情報です:

https://msdn.microsoft.com/en-us/library/hh241056(v=vs.100).aspx

+0

は、シリアライザのバイナリバージョンはありますか? – georch

+0

DataContractSerializerではありません。 –

関連する問題