gpt4 book ai didi

java - 使用 Kryo(自定义序列化程序)序列化对象

转载 作者:行者123 更新时间:2023-12-03 02:37:41 25 4
gpt4 key购买 nike

我有一个包含对象数组的对象。我愿意

  • A) 将这个对象数组存储在同一个文件中

  • B) 对这些对象使用自定义序列化。

例如,我有一个 Map 对象,其中包含 Tile[][] 数组。我可以很好地处理 Ints,但对如何处理对象感到困惑:

    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);
}
});

最佳答案

从你的例子中我可以看出你正在使用 Kryo v1。我建议使用 Kryo v2。

您可以像您一样为 Map 设置序列化器,然后序列化每个键和值。要序列化每个对象,请使用输出类写入数据并使用输入类读取数据,或者调用 Kryo 实例上的方法以使其处理对象。

使用内置的 MapSerializer 会更容易。您只需要自定义 Tile 对象的序列化。您可以让它们扩展 KryoSerialized,也可以注册一个序列化器。这是一个例子...

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 而不是 KryoSerialized:

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。如果根本不使用引用,或者如果您知道“某物”对象不可能引用我们刚刚创建的图 block ,则可以省略此操作。如果您仅使用 Input 读取数据,则无需调用 Kryo#reference。

关于java - 使用 Kryo(自定义序列化程序)序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com