Если у меня есть объект A и B, оба содержат некоторое поле сериализованного поля F, и оба указывают на один и тот же сериализуемый объект C. Производит ли protobuf-net сериализовать по ссылке или сериализовать по значению? Когда дескрипция объекта графа объектов, protobuf-net генерирует 2 отдельных объекта для A.F и B.F? Я спрашиваю, потому что хочу знать, сохраняет ли сериализация ссылочное равенство.
Протоугольный граф объекта protobuf-net
Ответ 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 {...}
Это приведет к сериализации экземпляра один раз, генерируя уникальный идентификатор в выводе. При десериализации один и тот же объект будет использоваться в обоих местах.