simpleframework,将空元素反序列化为空字符串而不是null

时间:2011-04-13 11:43:24

标签: java serialization deserialization simple-framework

我在项目中使用simpleframework(http://simple.sourceforge.net/)来进行序列化/反序列化需求,但是在处理空/时它没有按预期工作(好吧,至少不是我期望的) null字符串值。

如果我使用空字符串值序列化对象,它将显示为空的xml元素。

所以这个     MyObject object = new MyObject();
object.setAttribute(""); // attribute is String

将序列化为
    <object>
<attribute></attribute>
</object>

但反序列化该空属性将最终为null,而不是空字符串。

我是否认为它应该是一个空字符串而不是null?我怎么能以我想要的方式让它工作?

哦,如果我用null属性序列化对象,它最终会显示出来     <object/> 正如人们所预料的那样。

编辑:

添加了一个我正在运行的简单测试用程序

@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值为null。我通过创建自定义Converter for 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 个答案:

答案 0 :(得分:10)

回答完整性

使用convert注释注释元素,并将转换器类作为参数 @Convert(SimpleXMLStringConverter.class)

创建转换器类,该字符串将从null转换为空字符串

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 :(得分:1)

使用属性注释。它有一个名为empty的属性,用于提供默认值。

请参阅Simple Framework Javadocs.

答案 2 :(得分:-1)

我认为它应该是一个空字符串而不是null?我完全疯了吗?

据我所知...通常这表明序列化在整个过程中存在一些问题,它应该返回Object以及它所有的非瞬态实例变量,并且序列化时设置的值。

顺便说一句,你没有发布所有代码,序列化启动的顺序也可能意味着它跳过字符串数据,这有时会成为一个问题。