Сериализация UUID с помощью XMLEncoder
Я использую XMLEncoder для записи графа объектов в файл XML. Это прекрасно работает, за исключением свойства UUID (которое имеет идентификатор имени в моем JavaBean). Я знаю, что мне нужен 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:
encoder.setPersistenceDelegate(UUID.class, new UuidPersistenceDelegate());
Во время выполнения я получаю следующее исключение при вызове encoder.writeObject (...):
java.lang.IllegalArgumentException: неверная строка UUID: идентификатор
Кто-нибудь знает, как заставить это работать?
2 ответа
Я не видел, чтобы кто-то действительно отвечал на это правильно, и это действительно работает:
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);
}
}
Добро пожаловать в ТАК. Вы очень близки к своему решению, одна небольшая проблема с вашим кодом. Вы передаете строковое "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 не очень хорош, но по крайней мере вы избавитесь от своей ошибки.