2011-10-26 2 views
1

객체 배열이 포함 된 객체가 있습니다. 나는 그 개체에 대한 사용자 정의 직렬화를 사용하려면Kryo (사용자 정의 직렬 변환기)를 사용하여 객체 직렬화

  • A) 가게에 동일한 파일

  • B)의 객체의 배열을하고 싶습니다.

예를 들어, Tile [] [] 배열을 가진 Map 개체가 있습니다. 나는 물체를 수행하는 방법에의 int는 잘하지만, 혼동 할 수 있습니다 : 당신이 Kryo의 V1을 사용하는 사용자의 예에서 알 수

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 v2를 사용할 것을 제안한다.

Map에 대한 serializer를 설정 한 것처럼 각 키와 값을 직렬화 할 수 있습니다. 각 객체를 직렬화하려면 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의 시리얼을 사용한다 :

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 # 1 참조 호출의 판독 방법에서 약간 더 복잡 Kryo 인스턴스를 사용하여 자식 객체를 deserialize하기 전에. 이것은 참조를 전혀 사용하지 않거나 방금 작성한 타일을 "무언가"객체가 참조 할 수 없다는 것을 알고 있다면 생략 할 수 있습니다. 입력을 사용하여 데이터를 읽는 경우 Kryo # 참조를 호출 할 필요가 없습니다.

관련 문제