simpleframework, десериализация пустого элемента в пустую строку вместо нуля - PullRequest
7 голосов
/ 13 апреля 2011

Я использую 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);
    }

});

Ответы [ 3 ]

10 голосов
/ 18 апреля 2011

Ответы за полноту

Аннотируйте ваш элемент с помощью аннотации convert и присвойте ему класс конвертера в качестве параметра. @Convert(SimpleXMLStringConverter.class)

Создать класс конвертера, который выполняет преобразование строки из пустой строки в пустую

public class SimpleXMLStringConverter implements Converter<String> {


    @Override
    public String read(InputNode node) throws Exception {
        String value = node.getValue();
        if(value == null) {
            value = "";
        }
        return value;
    } 

    @Override
    public void write(OutputNode node, String value) throws Exception {
        node.setValue(value);
    }

}

И не добавляйте new AnnotationStrategy() в свой список.

1 голос
/ 13 апреля 2011

Используйте аннотацию атрибута. У него есть свойство с именем empty, используемое для предоставления значения по умолчанию.

См. Простые рамки Javadocs.

0 голосов
/ 13 апреля 2011

Я полностью помешан на том, что думаю, что это должна быть пустая строка вместо нуля?

Не настолько, насколько я знаю ... Обычно это указывает на некоторую проблему с сериализацией на этом пути, она должнавернуть объект и все его непереходные переменные экземпляра со значениями, установленными в сериализации.

Кстати, вы не опубликовали весь свой код, также возможно, что порядок, в котором начинается сериализация, означает, что он пропускает данные строкииногда это может быть проблемой.

...