c# - 在不标记成员的情况下使用 ProtoBuf.NET 进行序列化

标签 c# .net mono protobuf-net

我在某处读到 ProtoBuf.NET 作者的评论:

There are options to automatically infer the numbers, but that is brittle and not recommended. Only use this if you know you never need to add more members (it orders them alphabetically, so adding a new AardvarkCount will break everything).

这正是我感兴趣的那种情况:)

我有一些类似于 map-reduce 场景的东西,我想使用 Protocol Buffer (例如 map-reduce 的“ map ”端)序列化在远程机器上生成的结果,然后读取它们并将这些结果组合起来以供进一步使用处理(例如“减少”方面)。

我不想在我拥有的每个可能的类上开始一场属性装饰马拉松,在这个过程中可能会序列化,我确实发现 Protocol Buffer 非常诱人,因为我可以使用 Mono 创建结果并毫不费力地使用它们在 MS.NET 上,反之亦然...

不预先标记成员的明显缺点并没有打扰我,因为完全相同的软件修订会生成/使用 n,所以我不需要担心新成员在代码中弹出并弄乱我的整个计划...

简而言之,我的问题是:

  • 我该怎么做(使用 ProtoBuf.NET 序列化而无需自己标记/构建元类)?
  • 我的计划中是否有任何我明显错过的漏洞?

最佳答案

如果您可以接受单个 属性,那么诀窍是:

    [ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
    public class WithImplicitFields
    {
        public int X { get; set; }
        public string Y { get; set; }
    }

这里有两个选项; AllPublic 的工作方式类似于 XmlSerializer - 公共(public)属性和字段被序列化(使用字母顺序选择标记号); AllFields 的工作方式有点像 BinaryFormatter - fields 是序列化的(同样是字母顺序)。

我不记得这是否在 v2 API 上可用;我知道它在我的 list 上以确保工作!但是如果你想在没有任何属性的 v2 中使用它,我相信我可以添加一个 Add(ImplicitFields) 重载。

只要两端永远不会失调,就可以了。如果您存储数据,或者不“同步”地对两端进行版本控制,则可能会出现问题。另请参阅枚举的智能感知注释(它几乎重复了您已经知道的警告)。

关于c# - 在不标记成员的情况下使用 ProtoBuf.NET 进行序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609741/

相关文章:

c# - 按值传递结构

c# - WPF keyDown 响应时间准确性

c# - 如何使用 CSV Helper 在 C# 中逐行读取?

Linux 上的 C# : How to enumerate the computers on the local network?

json - System.Json 不见了?

c# - Windows Phone 8.1 - 如何使用参数处理硬件后退按钮返回上一页

c# - 如何使用 VS2008 将应用程序 list 嵌入到应用程序中?

c# - 无法序列化类型为 System.Collections.Generic.Dictionary`2 的成员 ...,因为它实现了 IDictionary

c# - 如何将多个参数传递给 View ?

mono - mono 4.1.0 上的证书安装错误