Как использовать Protobuf-сеть для сложных объектов? - PullRequest
2 голосов
/ 21 ноября 2011

мы используем wpf и хотим сериализовать сложный объект - модель представления.

Используя двоичный форматер, я могу просто добавить атрибут [Serializable], и ​​он будет автоматически работать длявесь класс, рекурсивно.

Есть ли у нас что-то похожее в protobuf?

Кроме того, где находится документация?

Я узнал о protoinclude и протомемберах, но это сложные объекты, которые могут измениться.компактный, быстрый и портативный.Но я не исключаю других вариантов, если они достигают тех же целей, более или менее, и просты в использовании.Пожалуйста, ответьте или предложите варианты.Спасибо

1 Ответ

2 голосов
/ 21 ноября 2011

BinaryFormatter управляет этим путем включения в вывод имени поля, которое является как многословным, так и хрупким (например, оно не выдержит изменения чего-либо из свойства field + в автоматически реализуемое свойство).

Если вы хотите сделать что-то подобное в protobuf-net, вы можете использовать «ImplicitFields», однако учтите, что это присваивает целочисленный ключ каждому члену в алфавитном порядке , поэтому подходит только в том случае, если ваша модель полностью исправлен как контракт и не будет добавлять / переименовывать участников , поскольку это нарушит контракт (что означает: вы не можете правильно десериализовать существующие данные). Например:

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Foo {...} // all public fields and properties are serialized,
                       // similar to XmlSerializer

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Bar {...} // all fields (not properties; public or private)
                       // are serialized, similar to BinaryFormatter

Если ваш контракт не является полностью фиксированным, предпочтительнее было бы явно назначить ключ каждому сериализованному участнику, что можно сделать в очень многими способами . Самое простое существо:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public int A {get;set;}

    ...
} 
...