0

我正在使用 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

有谁知道如何让它工作?

4

2 回答 2

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

}

于 2014-03-09T13:53:28.493 回答
0

欢迎来到 SO。您非常接近您的解决方案,您的代码存在一个小问题。您正在将字符串“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 不是很漂亮,但至少你会摆脱你的错误。

于 2012-01-20T19:07:17.180 回答