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 の使用をお勧めします。

あなたが持っているように、マップのシリアライザーを設定してから、各キーと値をシリアライズできます。各オブジェクトをシリアル化するには、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);
    }
}

KryoSerializable の代わりに Serializer を使用した別の例を次に示します。

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

これは、Kryo インスタンスを使用して子オブジェクトを逆シリアル化する前に Kryo#reference を呼び出すため、read メソッドでは少し複雑です。参照をまったく使用しない場合、または「何か」オブジェクトが作成したばかりのタイルを参照できないことがわかっている場合は、これを省略できます。Input を使用してデータを読み取るだけの場合は、Kryo#reference を呼び出す必要はありません。

于 2012-06-15T03:03:54.140 に答える