将json转换为Java中动态生成的protobuf

Ali*_*ian 12 java protocol-buffers protobuf-java google-protocol-buffer

鉴于以下json响应:

{
    "id" : "123456",
    "name" : "John Doe",
    "email" : "john.doe@example.com"
}
Run Code Online (Sandbox Code Playgroud)

以下user.proto文件:

message User {
    string id = 1;
    string name = 2;
    string email = 3;
}
Run Code Online (Sandbox Code Playgroud)

我想有可能动态创建protobuf消息类(在运行时编译.proto),这样如果json响应通过字段得到增强,"phone" : "+1234567890"我可以上传一个新版本的protobuf文件来包含string phone = 4并得到它protobuf响应中暴露的字段,没有重新启动服务.

如果我要从帽子中提取这些类,我希望能够在下面的代码中写一些东西.

import com.googlecode.protobuf.format.JsonFormat;
import com.googlecode.protobuf.Message;
import org.apache.commons.io.FileUtils;

...

public Message convertToProto(InputStream jsonInputStream){
    // get the latest user.proto file
    String userProtoFile = FileUtils.readFileToString("user.proto");

    Message userProtoMessage = com.acme.ProtobufUtils.compile(userProtoFile);
    Message.Builder builder = userProtoMessage.newBuilderForType(); 
    new JsonFormat().merge(inputStream, Charset.forName("UTF-8"), builder);
    return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

是否存在com.acme.ProtobufUtils.compile(...)方法?或者如何实现一个?运行protoc + load类似乎有点矫枉过正,但如果没有其他选择,我愿意使用它...

Maa*_*oAk 5

您不能编译.proto文件(至少不是在 Java 中),但是您可以将文件预编译.proto为描述符.desc

protoc --descriptor_set_out=user.desc user.proto
Run Code Online (Sandbox Code Playgroud)

然后使用DynamicMessage的解析器:

DynamicMessage.parseFrom(Descriptors.Descriptor type, byte[] data)
Run Code Online (Sandbox Code Playgroud)

来源:谷歌群组线程