Я использую simpleframework (http://simple.sourceforge.net/) в проекте для моих нужд сериализации / десериализации, но он не работает должным образом (ну, по крайней мере, не так, как я ожидаю) при работе с пустыми / нулевыми строковыми значениями.
Если я сериализую объект с пустым значением String, он будет показан как пустой элемент xml.
Итак, это
MyObject object = new MyObject();<br>
object.setAttribute(""); // attribute is String
будет сериализовано как
<object><br>
<attribute></attribute><br>
</object>
Но десериализация этого пустого атрибута закончится как нуль, а не пустая строка.
Я полностью помешан на мысли, что это должна быть пустая строка вместо нуля? И как же я могу заставить его работать так, как я не хочу?
О, и если я сериализую объект с нулевым атрибутом, он будет отображаться
<object/>
как и следовало ожидать.
Edit:
Добавлен простой тестовый пример, которым я сейчас пользуюсь
@Test
public void testDeserialization() throws Exception {
StringWriter writer = new StringWriter();
MyDTO dto = new MyDTO();
dto.setAttribute("");
Serializer serializer = new Persister();
serializer.write(dto, writer);
System.out.println(writer.getBuffer().toString());
MyDTO read = serializer.read(MyDTO.class, writer.getBuffer().toString(),true);
assertNotNull(read.getAttribute());
}
@Root
public class MyDTO {
@Element(required = false)
private String attribute;
public String getAttribute() {
return attribute;
}
public void setAttribute(String attribute) {
this.attribute = attribute;
}
}
Редактировать, исправлено:
По какой-то причине значение InputNode равно нулю, когда ему передается пустая строка. Я решил проблему, создав собственный конвертер для String.
new Converter<String>() {
@Override
public String read(InputNode node) throws Exception {
if(node.getValue() == null) {
return "";
}
return node.getValue();
}
@Override
public void write(OutputNode node, String value) throws Exception {
node.setValue(value);
}
});