【问题标题】:Serialization of an object with Kryo (Custom Serializer)使用 Kryo 序列化对象(自定义序列化程序)
【发布时间】:2011-10-26 22:13:11
【问题描述】:

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

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

【问题讨论】:

    标签: java serialization kryo


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2019-12-24
      相关资源
      最近更新 更多