Тип объекта в байте [] для десериализации со схемой?
Я пытаюсь заменить мой строковый протокол протоколом, использующим protobuf. Я сериализую команду перемещения с:
Schema<MoveCommand> schema = RuntimeSchema.getSchema(MoveCommand.class);
ProtostuffIOUtil.toByteArray(this, schema, buffer)
И моя команда удара с:
Schema<Hitcommand> schema = RuntimeSchema.getSchema(Hitcommand.class);
ProtostuffIOUtil.toByteArray(this, schema, buffer)
Это работает без проблем. Когда я сериализирую, результат будет байтом [], эти данные передаются и сокета к сокету сервера.
На сервере я считал массив byte[], но как я могу определить тип объекта, который находится внутри массива byte[]? (это и есть HitCommand или MoveCommand?)
Я спрашиваю об этом, потому что для десериализации мне нужна схема, и я могу создать / получить схему только тогда, когда знаю класс объекта, который находится внутри массива byte[].
С моим старым строковым протоколом у меня просто был тип сообщения в начале строки.
Я подозреваю, что упускаю что-то важное.
1 ответ
Тип сообщения не является частью сериализованных данных. Если у вас нет другого способа указать его, вы можете создать другое сообщение (возможно, называемое Envelope), содержащее либо Hitcommand, либо MoveCommand. Затем вы всегда можете десериализовать конверт и посмотреть, определены ли Hitcommand или MoveCommand.