Не удалось разобрать Protobuf в java

У меня есть два файла protobuf. Я должен сравнить содержимое обоих, чтобы продолжить работу с кодом. Для этого я пытаюсь проанализировать файл protobuf, но почему-то не могу получить различные типы сообщений и другую информацию в файле .proto. Я должен сделать все это в java.

Фрагменты кода:

    package com.example.demo;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;

    import com.google.protobuf.DescriptorProtos;
    import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
    import com.google.protobuf.Descriptors;
    import com.google.protobuf.Descriptors.FileDescriptor;
    import com.google.protobuf.InvalidProtocolBufferException;

    public class TestProto {


        public static FileDescriptorProto parseProto(InputStream protoStream)
                throws InvalidProtocolBufferException, Descriptors.DescriptorValidationException {

            DescriptorProtos.FileDescriptorProto descriptorProto = null;
            try {
                descriptorProto = FileDescriptorProto.parseFrom(protoStream);

                } catch (IOException e) {
                    e.printStackTrace();
            }
            return descriptorProto;
        }

        public static InputStream readProto(File filePath) {

            InputStream is = null;
            Reader reader = null;
            try {
                is = new FileInputStream(filePath);
                reader = new InputStreamReader(is); 
                int data = reader.read();  
                    while (data != -1) {  
                        System.out.print((char) data);  
                        data = reader.read();  
                    }  
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return is;

        }

        public static void main(String args[]) {

            InputStream protoStream = readProto(new File("D:/PROTOBUF CONVERTER/default.proto"));
            Descriptors.FileDescriptor fileDescriptor = null;
            DescriptorProtos.FileDescriptorProto fileDescriptorProto = null;
            try {
                fileDescriptorProto = parseProto(protoStream);
                fileDescriptor = FileDescriptor.buildFrom(fileDescriptorProto, new FileDescriptor[] {}, true);


                System.out.println("\n*******************");
                System.out.println(fileDescriptor.getFullName());
                System.out.println(fileDescriptor.getName());
                System.out.println(fileDescriptor.getPackage());
                System.out.println(fileDescriptor.getClass());
                System.out.println(fileDescriptor.getDependencies());
                System.out.println(fileDescriptor.toProto());
                System.out.println(fileDescriptor.getServices());
                System.out.println(fileDescriptor.getMessageTypes());
                System.out.println(fileDescriptor.getOptions());
            } catch(Exception e) {
                e.printStackTrace();
            }

        }
    }

pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.springboot</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>

        <properties>
            <java.version>1.8</java.version>
        </properties>

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.5.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
        </dependencies>

        <build>
        <finalName>ProtobufParseDemo</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <inherited>true</inherited>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

default.proto

syntax = "proto3";

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

Я вижу данные протофайла на консоли из-за строки кода «System.out.print ((char) data);». Однако я не вижу никакого вывода в sysout файловых дескрипторов. Я новичок в буферах протокола.

Вопросы:

  1. то, что я пытаюсь сделать, имеет ли это значение ИЛИ я делаю какую-то ошибку?
  2. Есть ли другой способ сделать это в Java?

Я видел несколько ответов, например, здесь : Как анализировать файл .proto в Java. В нем говорится, что входные данные для метода parseFrom должны быть двоичного типа, то есть скомпилированной схемы. Есть ли способ получить скомпилированную версию файла .proto в коде Java (не в командной строке)?

Хорошо, чтобы быть более ясным, я должен сравнить два файла .proto.

  • Первым будет тот, который уже загружен с моделью ML и
  • Второй будет тот, который должен быть загружен для той же модели ML.

Если есть различия в типах входных или выходных сообщений двух файлов .proto, то соответственно я должен увеличить номер версии модели.

Я нашел решения, в которых прототип преобразуется в дескрипторы прототипа, а затем преобразуется в массив байтов и далее передается метод tp parsrFrom. Разве этот процесс преобразования .proto в proto.desc нельзя выполнить с помощью кода Java?

Здесь следует иметь в виду, что у меня нет файлов прототипов в моем пути к классам, и указание адреса в pom.xml (адрес входных и выходных каталогов) здесь невозможно, так как мне нужно загрузить старый прототип и сравнить его. с новым прототипом, который будет загружен, как указано выше.


person user2609917    schedule 17.09.2019    source источник
comment
Плагин Protobuf maven входит в раздел плагинов POM, а не в зависимости. Затем он скомпилирует ваши прото-файлы при создании проекта.   -  person OneCricketeer    schedule 17.09.2019
comment
Будет ли он компилировать файлы protobuf, указанные в пути, указанном в коде Java? Как здесь: D:/PROTOBUF CONVERTER/default.proto. ? Я не добавляю прото файлы в путь к классам.   -  person user2609917    schedule 17.09.2019
comment
Рекомендуется хранить в проекте как `src/main/proto (по умолчанию), но, конечно, вы можете переопределить это xolstice.org/protobuf-maven-plugin/compile-mojo.html   -  person OneCricketeer    schedule 17.09.2019
comment
Спасибо @cricket_007, обратите внимание на то, что у меня нет файлов прототипов в моем пути к классам, и указание адреса в pom.xml (это входной и выходной каталоги) здесь невозможно, так как я должен загрузить старый прототип и сравните его с новым прототипом, который нужно загрузить, как указано выше в отредактированном вопросе.   -  person user2609917    schedule 18.09.2019