proto2扩展可以和grpc一起使用吗?

时间:2017-10-03 15:18:06

标签: java protocol-buffers grpc grpc-java

我有一个用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;    
}

非常感谢任何帮助或暗示。

1 个答案:

答案 0 :(得分:0)

在java中可能,但您需要使用ProtoLiteUtils.setExtensionRegistry()设置扩展注册表。这是一个实验性的API,未来可能会采用不同的方式来实现这一目标,但目前它应该是可用的。

更一般地说,gRPC支持所有消息编码。我们原生支持Proto3,但是有很多现有的Proto2用户使用gRPC。由于gRPC是编码不可知的,你甚至可以使用诸如thrift或JSON之类的东西,如果你真的想要,尽管我们不会为那些自动生成存根。