Хранить неуказанные сообщения буфера протокола в другом сообщении PB? - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь написать «расширяемый» формат файла с использованием буферов протокола Google (на Java).API должен иметь возможность считывать данные и возвращать «контейнерное» сообщение (известного типа), содержащее некоторые другие сообщения неизвестного типа (но которые известны вызывающей стороне API).

Чтовозможны ли способы как в определениях PB, так и в коде Java?

Один из очевидных способов - сохранить имя класса, реализующее неуказанное сообщение, вместе с байтовым массивом, содержащим данные сообщения,в сообщении «контейнер».Но я не знаю, как создать сообщение из его класса и байтового массива, используя отражение.

Другой способ - это, вероятно, использовать механизм «расширения», но я не совсем понимаю, как это сделать.это?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Если у вас есть правильное имя класса и байтовый массив, вы можете создать экземпляр соответствующего Builder через отражение, а затем вызвать для него метод mergeFrom(byte[]).

0 голосов
/ 29 декабря 2011

Мы сделали что-то похожее, но сделали общее сообщение, такое как:

message GenericMessage {
  required int32 id = 1;
  // further generic message headers

  message IntegerVariable {
    required string name = 1;
    optional int32 data = 2;
  }
  repeated IntegerVariable integerVars = 2;

  message IntegerArrayVariable {
    required string name = 1;
    repeated int32 data = 2;
    optional int32 length = 3;
  }
  repeated IntegerArrayVariable integerArrayVars = 3;

  message DoubleVariable {
    required string name = 1;
    optional double data = 2;
  }
  repeated DoubleVariable doubleVars = 4;

  ...

  message RawVariable {
    required string name = 1;
    optional bytes data = 2;
  }
  repeated RawVariable rawVars = x;
}

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

Если вы создадите дополнительный слой для обработки этих сообщений, я бы предложил обработать сообщение в HashMap<String, Object> и вернуть его приложению вместе с информацией заголовка. Между приложениями вам необходимо убедиться, что вы правильно указали имя и тип.

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