Данные буфера протокола синтаксического анализа без них - PullRequest
1 голос
/ 14 мая 2019

Трудно ли проанализировать сериализованный буфер протокола без использования скомпилированного из него класса .proto / a?

Очевидно, что это проще сделать с .proto. Мне интересно, можно ли легко проанализировать структуру данных, сериализованных с помощью протокольных буферов, без какого-либо другого дескриптора данных. Т.е. если код, который анализирует мои данные (который был сериализован с буфером протокола), знает, что он ожидает два целых числа и логическое значение, легко ли разобрать эти значения? Или буфер протокола добавляет дополнительный отступ / пух?

1 Ответ

1 голос
/ 14 мая 2019

Если код, анализирующий мои данные (который был сериализован с буфером протокола), знает, что он ожидает два целых числа и логическое значение, легко ли проанализировать эти значения?

Конечно;вам даже не нужно знать, что - вот инструмент , который будет пытаться декодировать неизвестный протобуф без каких-либо данных схемы, но есть предостережения, и некоторые данные могут быть неоднозначными.protoc имеет встроенный аналогичный инструмент.

Что касается того, как получить к нему доступ из вашего собственного кода: все зависит от используемой вами библиотеки.Если используемая вами библиотека имеет API-интерфейс для чтения / анализа (а не просто для полной десериализации), вы можете использовать это.Вы также можете определить прототип proto2 со всем как поля расширения и использовать API расширения.Или, если вы знаете ожидаемую компоновку вашего конкретного объекта, вы можете просто объявить свой собственный тип либо в .proto, либо, возможно, даже не в этом.Имена не должны совпадать, только номера полей и типы.Например, с protobuf-net (.NET) в вашем сценарии будет работать следующее:

class SomeType {
    [ProtoMember(1)] public int A {get;set;}
    [ProtoMember(2)] public int A {get;set;}
    [ProtoMember(3)] public bool A {get;set;}
}
...
var obj = Serializer.Deserialize<SomeType>(source);
Console.WriteLine(obj.A); // int
Console.WriteLine(obj.B); // int
Console.WriteLine(obj.C); // bool

Там - это дополнительный "padding / fluff", поэтому я рекомендую читателя/ parser, но ... это не , что сложно.

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