Учитывая следующий ответ 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 кажется излишним, но я готов использовать его, если нет другого варианта ...