扩展协议缓冲区以使用现有协议?

3

据我所知,Protocol Buffers 主要用于那些可以控制服务器和客户端代码的项目。我的一般问题是 - Protocol Buffers 是否可以用于将二进制消息序列化/反序列化到使用现有协议的服务器?因此,我的问题如下:

  1. Protocol Buffers是否原生支持在文本文件中定义消息,并指定其序列化/反序列化方式?例如,假设服务器上的整数是大端字节序,客户端上的整数是小端字节序。有没有原生关键字可以考虑到这一点?另一个例子-如果一个字符串作为每个字符的一个字节传递,并且具有固定长度,或者使用2个字节来指定长度,则是否有原生关键字来指定这一点,以便正确执行序列化/反序列化?
  2. 如果Protocol Buffers不支持任何本地微调如何对现有协议进行序列化/反序列化,则可以通过扩展添加该功能吗?可以添加一些关键字,这些关键字将被序列化/反序列化方法识别吗?也许可以通过扩展或修改protobuf-csharp-port或protobuf-net中的代码来实现这一点?.proto文件可以使用称为序列化类型的新类型的关键字,该关键字可用于指定字段的序列化行为类型。如果实现序列化类型的方法实现为公共虚拟函数,则自定义类可以覆盖该行为以进行专门处理。我能想到的唯一其他事情是,由于Protocol Buffers使用模式来处理来自服务器的消息,因此它可以在处理来自服务器的消息时使用它,但不应尝试将其发送到服务器或期望任何类型的模式消息来自服务器。还有什么需要做才能使所有这些与协议缓冲区一起工作?
  3. 在此link中,比较了protobuf-csharp-port和protobuf-net。看起来protobuf-net更快。但是,哪个实现最适合实现新的序列化类型,以便可以微调控制如何对类型进行序列化/反序列化?
  4. 如果您认为在Protocol Buffers中包含此功能不合适,则是否有任何API可以接受包含二进制消息描述的文本文件,并将其转换为正确执行序列化和反序列化的C#类?我已经熟悉了API XSD2Code,它使用XML文件进行序列化/反序列化。但是,由于数据是二进制而不是XML,因此这对我没有帮助。

1
这可能会有用。http://stackoverflow.com/questions/25541392/is-there-a-better-way-of-using-protobuf-in-a-wcf-service-without-the-drawbacks?answertab=votes - Sumit Maingi
2个回答

3

1: 不,Protocol Buffers 是一个单一定义的格式;虽然有一些不同的选项(Varint vs Fixed Length vs Zigzag),但这并不是你想要的。

2: 不。

3: 不适用,按照第 2 条。

我无法评论第 4 条。


1

经过一晚思考,似乎有一个解决方案——尽管不能使用协议缓冲区。XSD2Code 可以将 XSD 文件或 XML 文件作为输入,并生成一个 C# 类,作为输出提供序列化/反序列化方法。

因此,真正需要做的就是编写一个小型实用程序,将包含二进制接口描述的文本文件转换为正确的 XML 文件,然后通过 XSD2Code 运行该输出 XML 文件以生成 C# 类。这应该不难做到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接