Динамическая схема и десериализация с использованием прототипа
Я использую Protostuff в попытке сериализовать / десериализовать объекты нескольких различных типов, для которых нет доступных источников protobuf (это сценарий RPC сервер-сервер). Сериализация идет хорошо, потому что я знаю тип объекта для сериализации и могу создать схему:
Schema schema = RuntimeSchema.getSchema(object.getClass());
Теперь я использую ProtobufIOUtil.toByteArray
и получить массив байтов, который я затем передам на удаленный сервер. Однако я не могу десериализовать этот байтовый массив на удаленном сервере, потому что у меня нет возможности создать схему для объекта "неизвестного" типа. Можно ли как-то обойти это и использовать Protostuff так же, как я использовал бы собственную сериализацию Java?
1 ответ
Есть несколько решений с общей идеей - сериализовать имя класса вместе с данными.
Первый требует protostuff-runtime
, Вы должны создать класс-оболочку с одним полем типа Object
:
public class Wrapper {
public Object data;
}
Затем вы помещаете свой объект в data
поле и сериализация оболочки, protostuff-runtime
автоматически добавит имя класса в сериализованную форму, а затем использует его для десериализации.
Если вы хотите больше контроля, то вы можете сделать подобное без protistuff-runtime
,
Во-первых, вам нужен класс-обёртка:
public class Wrapper {
public String clazz;
public byte[] data;
}
Затем вы должны сериализовать ваши данные в байтовый массив, сохранить их в оболочку, а затем сериализовать экземпляр оболочки.
На удаленной стороне, вы десериализуете Wrapper
сначала, а затем получить clazz
поле - это класс, который вы должны использовать для десериализации data
,