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类似乎有点矫枉过正,但如果没有其他选择,我愿意使用它...
您不能编译.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)
来源:谷歌群组线程
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |