好奇 - 是否可以使用F#协议缓冲区?有什么警告等吗?
答案 0 :(得分:9)
我只是想自己回答这个问题。
Marc Gravell's protobuf-net project与F#开箱即用,因为它使用标准的.NET惯用语。您可以使用属性来获取序列化,而无需编写.proto文件或进行任何两阶段编译,或者您可以从标准.proto文件生成必要的代码。性能对.NET来说很好,但比OCaml内置的Marshal
模块更慢。但是,此库会强制您使每个消息类型中的每个字段都可变。这确实适得其反,因为消息应该是不可变的。此外,文档还有很多不足之处,但是,这是免费软件。
我还没有设法让Jon Skeet's protobuf-csharp-port library完成工作。
理想情况下,您可以将所有内置的F#类型(元组,记录,联合,列表,集,映射......)序列化为现成的这种线路格式,但没有现有的开源解决方案能够做到这一点。我也担心这些解决方案的复杂性:Jon Skeet是88,000行C#代码和注释(!)。
顺便说一句,我很失望地看到Google协议缓冲区未指定DateTime
或decimal
个数字的标准格式。
我还没有看过Proto#,甚至找不到Froto的下载。还有ProtoParser,但它只解析.proto文件,实际上无法序列化任何内容。
答案 1 :(得分:4)
没有F#特定的一个listed here,但有一个OCaml,或者有一个.NET“general”(protobuf-net)。
老实说,我根本没有用F#对象尝试使用protobuf-net,部分原因是因为我根本不了解F#,但是如果你能创建POCO,它们应该可以工作。然而,他们需要一些类型的可变性(可能甚至只是私有的可变性)才能与protobuf-net一起工作。
如果您乐意生成C#DTO并且使用来自F#,那么protobuf-net或Jon's port应该可以正常工作。
答案 2 :(得分:3)
我希望my own port和Marc Gravell's能够与F#一起正常工作,其程度与任何其他.NET库相同。换句话说,这两个端口都不是以可能产生惯用F#代码的方式编写的,但它们应该可以工作。
我的端口将生成C#代码,因此您需要将其构建为序列化模型的单独项目 - 但这应该与F#互操作而不会出现任何问题。生成的类型是不可变的(使用可变构建器),因此应该有助于F#上下文。
当然,您可以随时获取任一项目的核心部分,并提出一个惯用的F#解决方案 - 无论是将整个项目移植到F#还是将现有库与F#代码生成器和辅助函数一起使用,或者某些东西那样的。