Ответ 1
Необработанная спецификация "protobuf", определенная Google, представляет собой сериализатор дерева (например, XmlSerializer). Таким образом, по умолчанию вы будете получать сериализацию C дважды и два разных объекта при десериализации.
Однако, это такой общий вопрос, что в "v2" я предоставляю это как поведение при входе; обратите внимание, вы должны использовать это только для protobuf-net для protobuf-net, поскольку другие клиенты не ожидают этой конфигурации (хотя она остается действительным потоком protobuf).
Например (используя атрибуты, бит, вы также можете использовать модель времени выполнения):
[ProtoContract]
public class A {
...
[ProtoMember(5, AsReference=true)]
public C Foo {get;set;}
}
[ProtoContract]
public class B {
...
[ProtoMember(7, AsReference=true)]
public C Bar {get;set;}
}
[ProtoContract]
public class C {...}
Это приведет к сериализации экземпляра один раз, генерируя уникальный идентификатор в выводе. При десериализации один и тот же объект будет использоваться в обоих местах.