我有一个用GO编写的grpc客户端和一个用Java编写的grpc服务器(两者都使用相同的proto文件(语法2)。
我的grpc方法接收可能包含扩展名的消息。我能够在客户端上构造包含所需扩展名的消息并将其发送到服务器。但是当我尝试在服务器上阅读消息时,我的扩展名可用作未知字段。 (换句话说,Java中的 entity.hasExtension(extension)返回false)。
所以我的问题是grpc是否允许在作为方法参数提供的消息中使用扩展。如果没有,有没有办法将未知字段转换为特定类型的字段?
我的原型文件:
syntax = "proto2";
// proto file used as source for go client and java server as well
package my_services;
import "basic_types.proto";
// import "extension_types.proto";
// do not delete: options for generating java code
option java_multiple_files = true;
option java_package = "myservice.grpc";
option java_outer_classname = "MyServiceWrapper";
option objc_class_prefix = "Foo";
// Interface exposed by the server.
service DataService {
// Obtains all objects satisfying the request message
rpc MyMethod(DataRequest) returns (DataResponse) {}
}
message DataRequest {
optional IdDefinition id = 1;
repeated basic_types.Entity templates = 2;
}
message DataResponse {
repeated IdDefinition id = 1;
optional basic_types.DataResult result = 2;
}
message IdDefinition {
optional int32 myid = 1;
}
basic_types.Entity 是包含扩展名的基本邮件:
message Entity {
extensions 1 to max;
}
可以延长,例如像这样:
extend basic_types.Entity {
optional Foo foo = 1000;
optional Bar bar = 1001;
}
非常感谢任何帮助或暗示。
答案 0 :(得分:0)
在java中可能,但您需要使用ProtoLiteUtils.setExtensionRegistry()
设置扩展注册表。这是一个实验性的API,未来可能会采用不同的方式来实现这一目标,但目前它应该是可用的。
更一般地说,gRPC支持所有消息编码。我们原生支持Proto3,但是有很多现有的Proto2用户使用gRPC。由于gRPC是编码不可知的,你甚至可以使用诸如thrift或JSON之类的东西,如果你真的想要,尽管我们不会为那些自动生成存根。