2011-04-13 37 views
7

我在项目中使用simpleframework(http://simple.sourceforge.net/)用于序列化/反序列化需求,但它不像预期的那样工作好吧,至少不是我期望的)在处理空/空字符串值时。simpleframework,将一个空元素反序列化为一个空字符串而不是null

如果我序列化一个空字符串值的对象,它将显示为一个空的XML元素。

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

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

但反序列化空的属性将最终为空值,而不是一个空字符串。

我是不是觉得它应该是一个空字符串,而不是null?我怎样才能让它按我想要的方式工作?

哦,如果我序列化一个空属性的对象,它会最终显示 <object/> 如人们所期望的。

编辑:

添加了一个简单的测试用例我currenty运行

@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 。我通过创建一个自定义的字符串转换器来解决该问题。

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

}); 

回答

10

回答的完整性

与转换注解注释你的元素,并给它一个转换器类作为参数 @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()

+0

非常感谢! – Boy 2013-03-23 09:34:40

+0

它就像一个魅力 – 2016-03-31 07:26:44

1

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

Simple Framework Javadocs.

+0

如果我理解正确,@Attribute注释为xml元素创建一个Attribute,所以它不会影响元素本身。 – Sand 2011-04-13 12:44:52

-1

我是,如果认为它应该是一个空字符串代替空完全疯狂?

不像我所知...通常这表示一路上序列化的一些问题,它应该返回对象和所有它的非瞬态实例变量与序列化上设置的值。

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

+0

所以这是输入节点,导致它,tx,有助于知道:) – Selenia 2011-04-13 13:26:53

相关问题