如何将C#中现有的POCO类转换为谷歌Protobuf标准POCO

时间:2017-06-15 07:23:32

标签: serialization protocol-buffers protobuf-net

我有POCO课程,我使用NewtonSoft json进行分类。现在我想将其迁移到Google协议buff。有没有办法我可以迁移我的所有类(不是手动),以便我可以使用谷歌协议buff进行序列化和解除分类。

1 个答案:

答案 0 :(得分:0)

你只是想让它起作用吗? 绝对最简单的方法是使用protobuf-net并添加[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]。这样做是告诉protobuf-net 组成字段编号,它通过采取所有公共成员,按字母顺序排序,并向上计数来完成。然后,您可以将您的类型与ProtoBuf.Serializer一起使用,它应该按照您期望的方式运行。

这是简单,但它不是很健壮。如果您添加,删除或重命名成员,它们都会失去同步。这里的问题是协议缓冲区格式不包括名称 - 只是字段编号,并且随着时间的推移很难保证数字 。如果您的类型可能会更改,您可能希望明确定义字段编号。例如:

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

    [ProtoMember(2)]
    public List<string> Names {get;} = new List<string>();
}

另外需要注意的是非零默认值。默认情况下,protobuf-net假定隐含默认值的某些内容。如果您经常使用非零默认值而不非常小心地执行此操作,protobuf-net可能会误解您。如果您愿意,可以全局关闭:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false;