次のjson応答があるとします。
{
"id" : "123456",
"name" : "John Doe",
"email" : "[email protected]"
}
そして、次のser.protoファイル:
message User {
string id = 1;
string name = 2;
string email = 3;
}
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();
}
既存のcom.acme.ProtobufUtils.compile(...)メソッドはありますか?またはそれを実装する方法は? protoc + loadクラスを実行するのはやり過ぎのようですが、他に選択肢がない場合は使用したいと思います...
.proto
ファイルをコンパイルすることはできません(少なくともJavaでは)。ただし、.proto
を記述子.desc
にプリコンパイルすることはできます。
protoc --descriptor_set_out=user.desc user.proto
次に、DynamicMessage
のパーサーを使用します。
DynamicMessage.parseFrom(Descriptors.Descriptor type, byte[] data)
ソース: グーグルグループスレッド