Сериализация UUID с помощью XMLEncoder - PullRequest
0 голосов
/ 20 января 2012

Я использую XMLEncoder для записи графа объектов в файл XML. Это работает нормально, за исключением свойства UUID (которое имеет имя id в моем JavaBean) Я знаю, что мне нужен PersistanceDelegate, чтобы сделать это. Я написал следующее:

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:

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

Во время выполнения я получаю следующее исключение при вызове encoder.writeObject (...):

java.lang.IllegalArgumentException: неверная строка UUID: идентификатор

Кто-нибудь знает, как заставить это работать?

Ответы [ 2 ]

1 голос
/ 09 марта 2014

Я не видел, чтобы кто-то действительно отвечал правильно, и это действительно работает:

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

}

0 голосов
/ 20 января 2012

Добро пожаловать на SO.Вы очень близки к вашему решению, одна незначительная проблема с вашим кодом.Вы передаете String "id" в свой аргумент аргументов, что, я уверен, вы не хотите делать.Попробуйте вместо этого:

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

Выведенный XML не очень хорош, но по крайней мере вы избавитесь от своей ошибки.

...