栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

运行时生成的协议缓冲区对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

运行时生成的协议缓冲区对象

您所描述的内容实际上已经由C
++和Java中的协议缓冲区实现支持。您所需要做的就是传输一个

FileDescriptorSet
,
google/protobuf/descriptor.proto
其中包含定义了
FileDescriptorProto
代表每个相关
.proto
文件的,然后用于
DynamicMessage
在接收端解释消息。

要

FileDescriptorProto
在C ++中获取
Foo
该文件中定义的给定消息类型,请执行以下操作:

google::protobuf::FileDescriptorProto file;Foo::descriptor().file()->CopyTo(&file);

将

FileDescriptorProto
定义所需类型的所有s以及它们导入的所有文件放入
FileDescriptorSet
原型。请注意,您可以使用
google::protobuf::FileDescriptor
(由返回的东西
Foo::descriptor().file()
)遍历依赖关系,而不必显式命名每个依赖关系。

现在,发送

FileDescriptorSet
给客户端。

在客户端上,用于

FileDescriptor.buildFrom()
将每个转换
FileDescriptorProto
为live
Descriptors.FileDescriptor
。您必须确保先构建依赖项,然后再构建依赖项,因为在构建依赖项时必须提供已经
buildFrom()
构建的依赖项。

从那里,你可以使用

FileDescriptor
的
findMessageTypeByName()
找到
Descriptor
您所关心的具体消息类型。

最后,您可以调用

DynamicMessage.newBuilder(descriptor)
以为所讨论的类型构造一个新的构建器实例。
DynamicMessage.Builder
实现该
Message.Builder
接口,该接口具有字段,
getField()
并且
setField()
可以动态地(通过指定相应的
FieldDescriptor
s)操纵消息的字段。

同样,您可以调用

DynamicMessage.parseFrom(descriptor,input)
解析从服务器收到的消息。

注意,它的一个缺点

DynamicMessage
是它相对较慢。从本质上讲,它就像一种解释语言。生成的代码更快,因为编译器可以针对特定类型进行优化,而编译器
DynamicMessage
必须能够处理任何类型。

但是,实际上没有解决方法。即使您运行了代码生成器并在运行时编译了该类,实际 使用
新类的代码仍将是您在知道要使用的类型之前编写的代码。因此,它仍然必须使用反射或类似反射的接口来访问消息,这比为特定类型手写代码要慢。

但这是个好主意吗?

好吧,这取决于。客户端实际上将从服务器收到的此架构 做 什么?通过网络传输模式并不能使客户端与该协议版本兼容,客户端仍必须 了解
协议的含义。如果协议已在向后兼容的方式被改变,这几乎肯定意味着该 意思
协议的名称已更改,并且客户端代码必须更新(是否传输模式)。唯一可以期望客户端无需更新就可以继续工作的情况是,客户端仅执行仅取决于消息内容而不取决于消息含义的通用操作时,例如,客户端可以将消息转换为JSON不必知道这意味着什么。但这是相对不寻常的,尤其是在应用程序的客户端。这正是Protobufs默认不发送任何类型信息的原因-
因为它通常是无用的,因为如果接收者不知道 含义 ,则该架构是无关紧要的。

如果问题在于服务器正在向客户端发送消息,这些消息根本不打算被解释,而只是在稍后发送回服务器,则客户端根本不需要架构。只是将消息发送为

bytes
,不必理会它。请注意,
bytes
包含类型为编码的消息的字段在线路上
Foo
看起来与类型实际声明为的字段完全相同
Foo
。实际上,您可以针对
.proto
文件的稍有不同的版本来编译客户端和服务器,在该版本中,客户端看到的是特定字段,
bytes
而服务器将其视为子消息,从而避免了客户端知道该定义该子消息。``



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号