конвертировать protobuf в другой protobuf - PullRequest
0 голосов
/ 14 февраля 2019

Я читаю Protobuf из Kaka, так что, наконец, я получаю сгенерированный Java-объект.Я хотел бы переименовать / создать другой Protobuf на основе полученного оригинала.

Допустим, у меня есть 2 класса A и B. Мой код прослушивает тему Кафки и получает A. Я хотел бы "преобразовать" Aк B, который является почти тем же объектом (несколько изменений имени переменной).есть ли способ перезаписать Protobuf Parser?для генерации B вместо A?

например:

Class A{
String aa;
int aaaa;
}

Class B{
String bb;
int bbbb;
}

мой слушатель получает A, и я хотел бы получить B (bb = aa, bb = aaaa

1 Ответ

0 голосов
/ 07 мая 2019

Предполагая, что A и B совместимы (одинаковые теги имеют одинаковый тип), вы можете сериализовать обратно свой прото и снова проанализировать его.Это также будет работать, если некоторые теги отсутствуют в одном объекте, но синтаксический анализ в основном завершится неудачей, если существуют два тега с разными типами.

Proto:

Message A {
  string aa = 1;
  int32 aaaa = 2;
  int32 a_only = 3;
}

Message B {
  string bb = 1;
  int32 bbbb = 2;
  string b_only = 4;  // Must not be 3.
}

Java:

A a = GetAFromQueue();
B b = B.parseFrom(a.toByteArray());

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

byte[] data = GetDataFromQueue();
A a = A.parseFrom(data);
[...]
B b = B.parseFrom(data);
...