web-dev-qa-db-ja.com

Java)でjsonを動的に生成されたprotobufに変換します

次の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クラスを実行するのはやり過ぎのようですが、他に選択肢がない場合は使用したいと思います...

12
Alin Stoian

.protoファイルをコンパイルすることはできません(少なくともJavaでは)。ただし、.protoを記述子.descにプリコンパイルすることはできます。

protoc --descriptor_set_out=user.desc user.proto

次に、DynamicMessageのパーサーを使用します。

DynamicMessage.parseFrom(Descriptors.Descriptor type, byte[] data)

ソース: グーグルグループスレッド

3
MaanooAk