Protobuf парсер разбирает другие объекты?
Я использовал буферы протокола для моего проекта на Java. Я обнаружил, что анализатор для объекта protobuf анализирует другие данные Protobuf и не выдает исключение. Вместо этого он возвращает объект типа анализатора без каких-либо данных (не экземпляр по умолчанию)
Ниже мой тестовый файл прото
option java_package = "tester";
option java_outer_classname = "TestProto";
message A{
string message = 1;
}
message B{
int64 id = 1;
}
ниже мой тестовый код
TestProto.A a = TestProto.A.newBuilder().setMessage("My Test Message").build();
TestProto.B b = TestProto.B.getDefaultInstance().getParserForType().parseFrom(a.toByteString());
System.out.println("Is default instnace :" + (b.getDefaultInstanceForType() == b));
этот код работает без исключения, и результатом является "ложь".
Я не могу понять это поведение, мне нужна ситуация, когда мне нужно проанализировать некоторые сериализованные объекты protobuf, и если один парсер не работает, я должен попробовать другой парсер. Как я могу решить это.
Благодарю.
1 ответ
Protobuf основывается на обоих концах, заранее зная и согласовывая структуру данных. Если вы попытаетесь интерпретировать сообщение с радикально иной структурой, будут предоставлены абсолютно нулевые гарантии.
- это может привести к ошибке
- это может сработать и подарить вам благие намерения
- он может работать и сохранять все необходимое как неизвестные поля
Все возможно.
По сути: вы не можете полагаться на это поведение.
Примечание: есть гарантии, сделанные в отношении определенных изменений, таких как добавление или удаление полей (гарантируя, что они не будут использоваться повторно с другими типами / значениями). Это нормально и ожидаемо. Но другие изменения просто не определены.
Я нуждаюсь в ситуации, когда мне нужно проанализировать некоторые сериализованные объекты protobuf, и если один парсер выходит из строя, я должен попробовать другой парсер. Как я могу решить это.
Ты не можешь.