Динамическая схема и десериализация с использованием прототипа

Я использую 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,

Другие вопросы по тегам