2

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

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

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

例如,我有一个包含 Tile[][] 数组的 Map 对象。我可以很好地做 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);
        }
    });
4

1 回答 1

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.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。

于 2012-06-15T03:03:54.140 回答