Преобразование json в динамически сгенерированный protobuf в Java

Учитывая следующий ответ json:

{
    "id" : "123456",
    "name" : "John Doe",
    "email" : "[email protected]"
}

И следующий файл user.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(jsonInputStream, Charset.forName("UTF-8"), builder);
    return builder.build();
}

Есть ли существующий метод com.acme.ProtobufUtils.compile (...)? Или как его реализовать? Запуск класса protoc + load кажется излишним, но я готов использовать его, если нет другого варианта ...


person Alin Stoian    schedule 23.08.2018    source источник


Ответы (1)


Вы не можете скомпилировать .proto файл (по крайней мере, не на Java), однако вы можете предварительно скомпилировать .proto в дескриптор .desc

protoc --descriptor_set_out=user.desc user.proto

а затем используйте синтаксический анализатор DynamicMessage:

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

Источник: ветка групп Google

person MaanooAk    schedule 02.09.2018
comment
Просто хотел дважды проверить, если данные byte [] содержат больше полей, чем то, что изначально описано в файле .proto, не удастся ли выполнить синтаксический анализ? - person noMAD; 10.03.2021