Тип объекта в байте [] для десериализации со схемой?

Я пытаюсь заменить мой строковый протокол протоколом, использующим 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.

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