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

本文关键字:协议 缓冲区 扩展 | 更新日期: 2023-09-27 18:17:34

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

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

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

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

  4. 如果你认为在协议缓冲区中包含这个功能是不合适的,那么是否有任何api可以接受包含二进制消息描述的文本文件,并将其转换为c#类,正确地进行序列化和反序列化?我已经熟悉API XSD2Code,它对XML文件进行序列化/反序列化。但这在这里没有帮助,因为数据是二进制的,不是XML。

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

1:不,协议缓冲区是单一定义的格式;有一些不同的选项(可变长度vs固定长度vs之字形),但:不是你想要的

2:不

3:不适用,由2

我不能评论4

经过一夜的思考,似乎确实有一个解决方案-尽管不是协议缓冲区。XSD2Code可以将XSD文件或XML文件作为输入,并生成提供序列化/反序列化方法作为输出的c#类。

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