我可以从您的示例中看出您正在使用 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。