使用XMLEncoder序列化UUID

时间:2012-01-20 16:19:57

标签: java serialization uuid xmlencoder

我正在使用XMLEncoder将对象图写入XML文件。 除了UUID属性(在我的JavaBean中具有名称 id )之外,它工作正常 我知道我需要一个PersistenceDelegate来完成它。我写了以下一篇:

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.setPersistenceDelegate(UUID.class, new UuidPersistenceDelegate());

在运行期间,我在调用encoder.writeObject(...)时遇到以下异常:

java.lang.IllegalArgumentException:无效的UUID字符串:id

有谁知道如何让它发挥作用?

2 个答案:

答案 0 :(得分: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);
}

}

答案 1 :(得分:0)

欢迎来到SO。您非常接近您的解决方案,这是您的代码的一个小问题。您将String“id”传递给arguments参数,我很确定您不想这样做。试试这个:

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

输出的XML并不漂亮,但至少你会摆脱你的错误。