Как преобразовать двоичные буферы протокола в JSON, используя дескриптор в Java - PullRequest
0 голосов
/ 03 января 2019

У меня есть сообщение с полем общеизвестного типа «Любой», которое может содержать сериализованное сообщение protobuf любого типа.

Я хочу преобразовать это поле в его представление json.

Я знаю, что требуются имена полей, и обычно вам нужно, чтобы сгенерированные классы были загружены в приложение, чтобы это работало, но я ищу способ сделать это с дескрипторами.

Сначала я разбираю дескрипторы:

 FileInputStream descriptorFile = new FileInputStream("/descriptor");
DescriptorProtos.FileDescriptorSet fdp = DescriptorProtos.FileDescriptorSet.parseFrom(descriptorFile);

Затем переберите все содержащиеся в сообщении сообщения и найдите правильное (используя URL-адрес типа «Любой», содержащий пакет и имя сообщения. Я добавляю его в TypeRegistry, который используется для форматирования JSON.

JsonFormat.TypeRegistry.Builder typeRegistryBuilder = JsonFormat.TypeRegistry.newBuilder();

String messageNameFromUrl = member.getAny().getTypeUrl().split("/")[1];

for (DescriptorProtos.FileDescriptorProto file : fdp.getFileList()) {
    for (DescriptorProtos.DescriptorProto dp : file.getMessageTypeList()) {
        if (messageNameFromUrl.equals(String.format("%s.%s", file.getPackage(), dp.getName()))) {

            typeRegistryBuilder.add(dp.getDescriptorForType()); //Doesn't work.
            typeRegistryBuilder.add(MyConcreteGeneratedClass.getDescriptor()); //Works

            System.out.println(JsonFormat.printer().usingTypeRegistry(typeRegistryBuilder.build()).preservingProtoFieldNames().print(member.getAny()));
            return;
        }

    }
}

Кажется, проблема в том, что синтаксический анализ дескриптора дает мне доступ к Descriptors.DescriptorProto объектам, но я не вижу способа получить объект Descriptors.Descriptor, необходимый для реестра типов. Я могу получить доступ к дескриптору конкретного класса с помощью getDescriptor (), и это работает, но я пытаюсь отформатировать JSON во время выполнения, получая доступ к предварительно сгенерированному файлу дескриптора из-за пределов приложения, и поэтому у меня нет этого конкретного класса, доступного для вызова getDescriptor()

Что было бы еще лучше, если бы я мог использовать URL-адрес типа поля «Любое», чтобы разрешить объект Type, и использовать его для генерации JSON, поскольку он также имеет номера и имена полей, необходимые для этого. процесс.

Любая помощь приветствуется, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...