使用ProtoBuf.NET进行序列化而不标记成员

dam*_*boy 14 .net c# mono protobuf-net

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

有自动推断数字的选项,但这很脆弱,不推荐.只有当你知道你永远不需要添加更多成员时才使用它(它按字母顺序排序,因此添加新的AardvarkCount会破坏所有内容).

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

我有一些类似于map-reduce场景的东西,我希望使用协议缓冲区(例如map-reduce的"map"侧)序列化在远程机器上生成的结果,然后读取它们并将这些结果组合起来进行进一步处理(例如"减少"方面).

我不想在我可能在此过程中序列化的每个可能的类上启动属性修饰马拉松,并且我发现协议缓冲区非常诱人,因为我可以使用Mono创建结果并在MS上毫不费力地使用它们. NET反之亦然......

没有预先标记成员的明显缺点并没有打扰我,因为完全相同的软件修订版生成/消费,所以我不需要担心新成员弹出代码并弄乱我的整个方案......

简而言之,我的问题是:

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

Mar*_*ell 9

如果你可以使用单个属性,那么诀窍是:

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

这里有2个选项; AllPublic工作方式XmlSerializer- 公共属性和字段被序列化(使用字母顺序选择标签号); AllFields有点像BinaryFormatter- 字段被序列化(再次,字母).

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

只要两端永远不会失步,这很好.如果您存储数据,或者没有"在步骤中"对两端进行版本化,则可能存在问题.另请参阅关于枚举的intellisense注释(它几乎重复了您已经知道的警告).

  • 我还有一个愿望,就是 ImplicitFields 是“递归的”,也就是说,如果我有一个包含 List<Z> 的类 X,并且我使用 Add(ImplicitFields),我希望它在整个过程中传播类链.. (2认同)