【问题标题】:Serialize a UUID with XMLEncoder使用 XMLEncoder 序列化 UUID
【发布时间】:2012-01-20 16:19:57
【问题描述】:

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

有谁知道如何让它工作?

【问题讨论】:

    标签: java serialization uuid xmlencoder


    【解决方案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);
    }
    

    }

    【讨论】:

      【解决方案2】:

      欢迎来到 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 不是很漂亮,但至少你会摆脱你的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多