我有一个疑问 - protocol buffers 是否可以与 F# 一起使用?有什么需要注意的地方吗?
我有一个疑问 - protocol buffers 是否可以与 F# 一起使用?有什么需要注意的地方吗?
我只是在试图回答这个问题。
Marc Gravell的protobuf-net项目因使用标准的.NET习语而可以直接与F#配合使用。您可以使用属性进行序列化,而无需编写.proto文件或执行任何两阶段编译,或者您可以从标准.proto文件生成必要的代码。性能对于.NET来说很好,但比OCaml内置的Marshal
模块慢得多。然而,此库强制使您使每个消息类型中的每个字段都是可变的。这实际上是适得其反的,因为消息应该是不可变的。此外,文档还有很多需要改进的地方,但这毕竟是免费软件。
我还没有成功地让Jon Skeet的protobuf-csharp-port库工作。
理想情况下,您应该能够将所有内置的F#类型(元组、记录、联合、列表、集合、映射等)直接序列化到这种线格式,但现有的开源解决方案都无法做到这一点。我还担心这些解决方案的复杂性:Jon Skeet的代码和注释总共有88,000行!
顺便说一句,我很失望地看到Google协议缓冲区没有指定DateTime
或decimal
数字的标准格式。
我还没有看过Proto#,甚至找不到Froto的下载链接。还有ProtoParser,但它只解析.proto文件,无法实际序列化任何内容。
这里没有一个特定于F#的解释,但有一个OCaml的解释,或者有一个.NET“通用”的解释(protobuf-net)。
老实说,我只是还没尝试过使用protobuf-net处理F#对象,部分原因是我不太了解F#,但如果您可以创建POCO,则应该可以正常工作。它们需要具有某种可变性(甚至可能只是私有可变性),才能与protobuf-net一起使用。
如果您愿意生成C# DTO并从F#中消耗它,则protobuf-net或Jon's port应该可以正常工作。