从您的示例中我可以看出您正在使用 Kryo v1。我建议使用 Kryo v2。
你可以像你一样为 Map 设置一个序列化器,然后序列化每个键和值。要序列化每个对象,可以使用 Output 类写入数据并使用 Input 类读取数据,或者调用 Kryo 实例上的方法让其处理对象。
使用内置的 MapSerializer 会更容易。您只需要自定义 Tile 对象的序列化。你可以让它们扩展 KryoSerializable 或者你可以注册一个 Serializer。这是一个例子......
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.something);
}
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#reference。如果根本不使用引用,或者如果您知道“某物”对象不可能引用我们刚刚创建的图块,则可以省略它。如果只使用 Input 读取数据,则无需调用 Kryo#reference。