我有一个包含对象数组的对象。我想
A)将此对象数组存储在同一文件
B)对这些对象使用自定义序列化。
例如,我有一个具有Tile [] []数组的Map对象。我可以做到很好,但对如何做对象感到困惑:
kryo.register(Map.class, new SimpleSerializer<Map>() {
public void write(ByteBuffer buffer, Map map) {
buffer.putInt(map.getId());
System.out.println("Putting: " + map.getId());
}
public Map read(ByteBuffer buffer) {
int id = buffer.getInt();
System.out.println("Getting: " + id);
Map map = new Map(id, null, 0, 0, 0, 0);
return (map);
}
});
答案 0 :(得分:12)
我可以从你的例子中看出你正在使用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);
}
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。如果不使用引用,或者如果您知道“something”对象不可能引用我们刚刚创建的tile,则可以省略。如果您只使用Input来读取数据,则无需调用Kryo#reference。