如何将Protobuf-net用于复杂对象?

时间:2011-11-21 07:03:32

标签: c# protocol-buffers protobuf-net

我们正在使用wpf,并希望序列化一个复杂的对象 - 一个视图模型。

使用二进制格式化程序,我只需添加一个属性[Serializable],它就可以递归地自动适用于整个类。

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

另外,文档在哪里?

我了解了protoinclude和protomembers,但这些都是可能发生变化的复杂对象。

我们想要使用protobuf,因为它小巧,快速,便携。但我不排除其他选择,如果它实现相同的目标,或多或少,并且易于使用。 请回答或建议选项。谢谢

1 个答案:

答案 0 :(得分:2)

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

如果您的合同没有完全修复,最好明确为每个序列化成员分配一个密钥,这可以在a great many ways中完成。最简单的是:

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

    ...
}