2011-10-26 81 views
1

我有一個包含對象數組的對象。我想使用Kryo(Custom Serializer)對對象進行序列化

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

回答

10

我可以告訴你從你的例子,你正在使用Kryo v1。我建議使用Kryo v2。

您可以像設置Map一樣爲序列化程序設置序列化程序,然後序列化每個鍵和值。要序列化每個對象,可以使用Output類寫入數據並使用Input類讀取,或者調用Kryo實例上的方法使其處理對象。

使用內置的MapSerializer會更容易。你只需要定製Tile對象的序列化。您可以讓它們擴展KryoSerializable,或者您可以註冊一個串行器。下面是一個例子...

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:

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

這是因爲調用KRYO#參考的在讀方法稍微複雜些在使用Kryo實例反序列化子對象之前。如果完全不使用引用,或者如果您知道「something」對象不可能引用我們剛剛創建的tile,則可以省略此參數。如果您只使用輸入來讀取數據,則不需要調用Kryo#參考。