私はシリアル化されたオブジェクトの複数のチャンクにわたってオブジェクト参照を追跡したいと思います。私が知っているシリアライザは参照を追跡できますが、グラフ全体を一度にシリアライズするだけです。私は部分的にグラフをシリアライズし、後でそれを別の部分にシリアル化したり、グラフからいくつかのオブジェクトを更新したりしたい。ストリーム間で参照トラッキングをサポートする.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シリアライザはかなり悪い選択肢です。
は、シリアライザのバイナリバージョンはありますか? – georch
DataContractSerializerではありません。 –