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

时间:2014-08-11 00:35:40

标签: c# serialization code-generation protocol-buffers protobuf-net

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

  1. 协议缓冲区本身是否支持在文本文件中定义消息的能力,然后指定如何序列化/反序列化?例如,假设整数在服务器上是大端,在客户端上是小端。是否有任何原生关键字会考虑到这一点?另一个例子 - 如果一个字符串作为一个字节传递给字符串中的每个字符并且具有固定长度或2个字节用于指定长度,是否有一个native关键字来指定它,以便序列化/反序列化可以正确完成

  2. 如果协议缓冲区不支持本地微调如何对现有协议进行序列化/反序列化,那么可以通过扩展添加该功能吗? 是否可以添加可被序列化/反序列化方法识别的关键字?也许这可以通过扩展或修改protobuf-csharp-port或protobuf-net中的代码来完成? .proto文件可以使用称为序列化类型的新类型的关键字,该关键字可用于指定字段的序列化行为的类型。 如果实现序列化类型的方法是作为公共虚函数实现的,那么自定义类可以覆盖该行为以进行专门处理。我能想到的另一件事是,由于协议缓冲区使用了一个模式,它可以在处理来自服务器的消息时使用它,但是不应该尝试将它发送到服务器或期望来自服务器的任何类型的模式消息。服务器。还有什么需要做的才能使协议缓冲区能够完成所有这些工作吗?

  3. 在此link中,比较了protobuf-csharp-port和protobuf-net。看起来protobuf-net更快。但是,哪种实现最适合实现一种新的序列化类型,可用于微调对类型如何序列化/反序列化的控制?

  4. 如果您认为在Protocol Buffers中包含此功能是不合适的,那么是否有任何API可以采用包含二进制消息描述的文本文件并将其转换为一个正确进行序列化和反序列化的C#类?我已经熟悉API XSD2Code,它使用XML文件进行序列化/反序列化。但这在这里没有用,因为数据是二进制的,而不是XML。

2 个答案:

答案 0 :(得分:3)

1:不,协议缓冲区是单一定义的格式;有一些不同的选项(varint vs fixed length vs zigzag),但是:不是你想要的

2:没有

3:不适用,按2

我无法评论4

答案 1 :(得分:1)

在一夜之间考虑这个问题后,似乎确实有一个解决方案 - 尽管没有协议缓冲区。 XSD2Code可以将XSD文件或XML文件作为输入,并生成一个C#类,它提供序列化/反序列化方法作为输出。

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