преобразовать protobuf в другой protobuf

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

скажем, у меня есть 2 класса A и B. мой код слушает тему Kafka и получает 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


person T1234    schedule 14.02.2019    source источник


Ответы (1)


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

Прото:

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.
}

Ява:

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

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

byte[] data = GetDataFromQueue();
A a = A.parseFrom(data);
[...]
B b = B.parseFrom(data);
person Nicolas Defranoux    schedule 07.05.2019