Здесь на стороне Java я могу десериализован поток, так что я могу узнать, есть 3 поля в потоке и его соответствующие name
, type
и value
Вы должны знать схемы заранее. Во-первых, protobuf не передает имена; все, что он использует в качестве идентификаторов, - это числовой ключ (1
, 2
и 3
в вашем примере) каждого поля.Во-вторых, он явно не указывает тип; в protobuf существует только очень мало типов проводников (varint, 32-bit, 64-bit, length-prefix, group); фактические данные типов отображаются на те, но вы не можете однозначно декодировать данные без схемы
- varint является «некоторой формой целого», но может быть подписан, без знака или «зигзаг» (что позволяет отрицательным числа малой величины, которые должны быть дешево закодированы), и могут быть предназначены для представления любой ширины данных (64 бит, 32 бит и т. д.).
- 32-разрядный может быть целым числом, но может быть подписан или без знака - или он может быть 32-разрядным числом с плавающей запятой
- 64-битное может быть целым числом, но может быть подписано или без знака - или это может быть 64-битный floati ng-point number
- длина-префикс может быть строкой UTF-8, последовательностью или необработанными байтами (без какого-либо особого значения), «упакованным» набором значений
repeated
некоторого примитивного типа (целое число, с плавающей запятой и т. д.), , или может быть структурированным под-сообщением в формате protobuf
- группы - hoorah! это всегда однозначно! это может означать только одно; но одна вещь в значительной степени устаревшим Google :(
Так принципиально: вы нужно схеме кодированные данные не включает то, что вы хотите Он делает это, чтобы избежать ненужного пространства - если.. протокол предполагает, что кодер и декодер оба знают, что сообщение предназначено выглядеть, то намного меньше информации должен быть отправлен.
Заметим, однако, что информация, которую является включен достаточно безопасно круглый -введите сообщение, даже если есть поля, которые не являются pected; нет необходимости знать имя или тип, если вам нужно только перекодировать его, чтобы передать его вперед/назад.
Что вы может сделать, это использовать парсер API для сканирования по данным, чтобы показать, что есть три поля, поле 1 является varint, поле 2 является длиной префикса, поле 3 является длиной префикса. Вы могли бы сделать образованные догадки о данных за его пределами (например, вы могли видеть, что декодер UTF-8 создает нечто похожее на текст и проверяет, что кодировка UTF-8 возвращает исходные байты, если это возможно это строка)
Скомпилировать тот же файл '.proto' и сгенерировать Java-код. Затем используйте это при десериализации. – maba
О, так это значит, что я использую это для модели типа клиент-сервер, мне также потребуется иметь .proto-файл на стороне сервера. Правильно !!!! – Avinash
Ему нужно использовать флаг '--java_out', чтобы сделать код' protoc' java code IIRC – Petesh