protobuf-net ライブラリを使用してオブジェクトのコレクションをシリアル化しようとしています。コレクション内の最上位オブジェクトがグラフ内の参照として設定されていないという問題が発生しています。したがって、それらがシリアル化された子でさらに下に参照されると、それらは再シリアル化され、その時点で参照として作成されます。 . トップレベルのオブジェクトを参照としてシリアル化する方法はありますか? protobuf-net がこれをサポートするようになったことを示しているように見える競合する投稿をいくつか読みましたが、他の投稿では、この動作を有効にするためにトップレベル オブジェクトのラッパーを作成することを提案しているようです。ありがとう...
これが私の問題を示すサンプルプログラムです。ご覧のとおり、参照は等しくありません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtoBuf;
namespace ProtoBufTest
{
[ProtoContract(AsReferenceDefault=true)]
public class Foo
{
[ProtoMember(1, AsReference=true)]
public FooChild Child;
[ProtoMember(2)]
public Guid Id;
}
[ProtoContract]
public class FooChild
{
[ProtoMember(1, AsReference=true)]
public Foo Parent;
}
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>()
{
new Foo() { Child = new FooChild(), Id = Guid.NewGuid() }
};
foos[0].Child.Parent = foos[0];
var clone = Serializer.DeepClone(foos);
Console.WriteLine(ReferenceEquals(clone[0], clone[0].Child.Parent));
Console.WriteLine(clone[0].Id == clone[0].Child.Parent.Id);
}
}
}