Как создать экземпляр класса TBase - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь десериализовать объекты Thrift из байтового массива.

Во всех найденных мной примерах десериализатор изменяет экземпляр интерфейса org.apache.thrift.TBase, переданный ему.
Какя могу создать экземпляр TBase?

TDeserializer deserializer = new TDeserializer(new TCompactProtocol.Factory());
byte[] data = ...// my serialized thrift object
TBase instance = ... // where to get this one ???

deserializer.deserialize((TBase) instance, data);

Код метода deserialize:

public void deserialize(TBase base, byte[] bytes) throws TException {
    deserialize(base, bytes, 0, bytes.length);
}

1 Ответ

0 голосов
/ 01 февраля 2019

Ты не.

Вместо этого вы создаете экземпляр (самого внешнего) объекта, который хотите десериализовать.

Из-за того, как работает Thrift, в сценариях RPC эта информация обычно неявно известна и поэтому не сериализуется.Итак, для целей сериализации вы должны знать, что это за тип, с помощью вашего собственного кода.

Поскольку это может легко стать кошмаром, если задействованы несколько типов «записей данных», такой подход заключается в следующемоказался очень удобным (и расширяемым):

union Outer {
  1:  MyCoolClass cool;
  2:  SomeOtherData  other;
  3:  Foobar  foobar;
  // can be extended with other types as needed
}

Используя эту конструкцию для сериализации и десериализации, вы знаете, что экземпляр для чтения / записи всегда равен Outer.

...