2012-01-20 1 views
0

XMLEncoder를 사용하여 객체 그래프를 XML 파일에 씁니다. UUID 속성 (JavaBean에 id이라는 이름이 있습니다.) 완료하려면 PersistenceDelegate가 필요하다는 것을 알고 있습니다.XMLEncoder를 사용하여 UUID 직렬화

class UuidPersistenceDelegate extends PersistenceDelegate { 
    protected Expression instantiate(Object oldInstance, Encoder out) { 
     UUID id = (UUID) oldInstance; 
     return new Expression(oldInstance, id.getClass(), "fromString", new Object[]{ "id" }); 
    } 
} 

그리고 인코더로 설정 : 나는 한 다음를 썼다 encoder.writeObject를 호출 할 때 런타임 동안

encoder.setPersistenceDelegate(UUID.class, new UuidPersistenceDelegate()); 

내가 예외를 다음 얻을 (...) :

java.lang.IllegalArgumentException : 올바르지 않은 UUID 문자열 : id

누구든지 작동하게하는 방법을 알고 있습니까?

답변

0

안녕하세요. 코드에 대한 사소한 문제점 중 하나 인 솔루션에 매우 가깝습니다. arguments 매개 변수에 문자열 "id"를 전달하고 있습니다.이 매개 변수는 여러분이하고 싶지 않은 매개 변수입니다. 대신 다음을 시도하십시오 :

protected Expression instantiate(Object oldInstance, Encoder out) { 
    UUID id = (UUID) oldInstance; 
    return new Expression(oldInstance, UUID.class, "fromString", new Object[]{ id.toString() }); 
} 

출력 된 XML은 좋지 않지만, 적어도 오류를 제거 할 것입니다.

1

나는 사람이 실제로 제대로이 답을 보지 못했다 그리고 실제로 작동 :

public class UUIDPersistenceDelegate extends PersistenceDelegate { 
private HashSet<UUID> hashesWritten = new HashSet<UUID>(); 

public Expression instantiate(Object oldInstance, Encoder out) { 
    UUID id = (UUID) oldInstance; 
    hashesWritten.add(id); 
    return new Expression(oldInstance, UUID.class, "fromString", new Object[]{ id.toString() }); 
} 

protected boolean mutatesTo(Object oldInstance, Object newInstance) { 
    return hashesWritten.contains(oldInstance); 
} 

}