如何使用Protobuf-net复杂的对象

本文关键字:对象 复杂 Protobuf-net 何使用 | 更新日期: 2023-09-27 18:15:20

我们正在使用wpf,并且想要序列化一个复杂的对象——一个视图模型。

使用二进制格式化器,我可以添加一个属性[Serializable],它会自动递归地为整个类工作。

我们在protobuf中有类似的东西吗?

还有,文档在哪里?

我学习了protoinclude和protommembers,但它们是可能会改变的复杂对象。

我们希望使用protobuf,因为它紧凑、快速、可移植。但我不排除其他选择,如果它或多或少地实现了相同的目标,并且易于使用。请回答或建议选项。谢谢你

如何使用Protobuf-net复杂的对象

BinaryFormatter通过在输出中包含字段名来管理这一点,这既冗长又脆弱(例如,它无法承受从字段+属性更改为自动实现的属性)。

如果你想在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;}
    ...
}