Я могу сказать из вашего примера, что вы используете Kryo v1. Я предлагаю использовать Kryo v2.
Вы можете установить сериализатор для карты, как у вас, а затем сериализовать каждый ключ и значение. Чтобы сериализовать каждый объект, либо запишите данные с использованием класса Output и прочитайте с использованием класса Input, либо вызовите методы в экземпляре Kryo, чтобы он обрабатывал объекты.
Было бы проще использовать встроенный MapSerializer. Вам нужно только настроить сериализацию объектов Tile. Вы можете сделать так, чтобы они расширяли KryoSerializable, или вы можете зарегистрировать Сериализатор. Вот пример ...
public class Tile implements KryoSerializable {
int x, y;
Object something;
public void write (Kryo kryo, Output output) {
output.writeInt(x);
output.writeInt(y);
kryo.writeClassAndObject(output, something);
}
public void read (Kryo kryo, Input input) {
x = input.readInt();
y = input.readInt();
something = kryo.readClassAndObject(input);
}
}
Вот еще один пример использования Serializer вместо KryoSerializable:
public class Tile {
int x, y;
Object something;
}
kryo.register(Tile.class, new Serializer<Tile>() {
public void write (Kryo kryo, Output output, Tile object) {
output.writeInt(object.x);
output.writeInt(object.y);
kryo.writeClassAndObject(output, object);
}
public Tile read (Kryo kryo, Input input, Class<Tile> type) {
Tile tile = new Tile();
kryo.reference(tile); // Only necessary if Kryo#setReferences is true AND Tile#something could reference this tile.
tile.x = input.readInt();
tile.y = input.readInt();
tile.something = kryo.readClassAndObject(input);
return tile;
}
});
Это немного сложнее в методе read из-за вызова ссылки на Kryo # перед использованием экземпляра Kryo для десериализации дочерних объектов. Это может быть опущено, если ссылки вообще не используются, или если вы знаете, что объект «что-то» не может ссылаться на плитку, которую мы только что создали. Если вы используете ввод только для чтения данных, вам не нужно вызывать Kryo # reference.