当前位置: 首页 > 知识库问答 >
问题:

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

杜起运
2023-03-14

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

>

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

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

如果您认为在协议缓冲区中包含此功能是不合适的,那么是否有任何API可以将包含二进制消息描述的文本文件转换为正确执行序列化和反序列化的C#类?我已经熟悉API XSD2代码,它对XML文件进行序列化/反序列化。但这在这里没有帮助,因为数据是二进制的,而不是XML。

共有2个答案

韦阳辉
2023-03-14

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

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

戎劲
2023-03-14

1:不,协议缓冲区是一种单一的定义格式;有一些不同的选项(瓦林特vs固定长度vs锯齿形),但是:不是你想要的

2:没有

3:不适用,由2

我不能评论第4条

 类似资料:
  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 我有一个简单的客户端和服务器设置。客户端希望在服务器中使用ZeroMQ执行通信方法。我将使用REQ和REP套接字,因为它们适合这个用例。然而,我对protobuf的定义有疑问。我认为这两个选项可用于实现目标: 其中“control”包含要远程执行的方法的名称。另一种选择可以是: 最好的方法是什么?或者至少使用一种方法而不是另一种方法的权衡是什么?

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?

  • 扩展说明 RPC 协议扩展,封装远程调用细节。 契约: 当用户调用 refer() 所返回的 Invoker 对象的 invoke() 方法时,协议需相应执行同 URL 远端 export() 传入的 Invoker 对象的 invoke() 方法。 其中,refer() 返回的 Invoker 由协议实现,协议通常需要在此 Invoker 中发送远程请求,export() 传入的 Invoker

  • 协议和扩展 你可以扩展一个已经存在的类型来采纳和遵循一个新协议, 就算是你无法访问现有类型的源代码也行. 扩展可以添加新的属性、方法和下标到已经存在的类型, 并且因此允许你添加协议需要的任何需要. protocol TextRepresentable { var textualDescription: String { get } } // 此处并无Dice这个类, 以及其sides属性