我可以告訴你從你的例子,你正在使用Kryo v1。我建議使用Kryo v2。
您可以像設置Map一樣爲序列化程序設置序列化程序,然後序列化每個鍵和值。要序列化每個對象,可以使用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);
}
}
下面是另一個例子,採用了串行的,而不是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;
}
});
這是因爲調用KRYO#參考的在讀方法稍微複雜些在使用Kryo實例反序列化子對象之前。如果完全不使用引用,或者如果您知道「something」對象不可能引用我們剛剛創建的tile,則可以省略此參數。如果您只使用輸入來讀取數據,則不需要調用Kryo#參考。