属性"空"使用SimpleFramework无法正常工作

时间:2017-01-02 11:48:19

标签: android xml simple-framework

所以当一个元素没有值时,我试图设置一个空属性。

所以我的班级看起来像这样:

@Order(attributes = { "name" })
public class TypeNumber {
    @Attribute(required = false)
    protected String name;

    @Element(required = false)
    @Attribute(empty = "xsi:nil=\"true\"")
    protected BigDecimal value;

    //getter setter methods goes here  
}

如果值为空,我期待输出:

<field name="some_name">
    <value xsi:nil="true"/>
 </field>

虽然实际输出是:

<field name="some_name"/>

知道为什么空属性没有按预期工作? 或者我做错了吗?

注意:我正在使用带有VisitorStrategy的SimpleFramework XML。因此,无法使用AnnotationStrategy。我也有自定义访问者来读写节点。

1 个答案:

答案 0 :(得分:2)

您需要一个自定义转换器......

现在您的输出是:
<typeNumber name="original" value="10"/>

<typeNumber name="original_empty" value="xsi:nil=&quot;true&quot;"/>

让我们开始吧!

您要做的第一件事是将AnnotationStrategy传递给Persister的构造函数:

Serializer serializer = new Persister(new AnnotationStrategy());

..然后在您的模型中创建自定义转换器:

@Root(name = "TypeNumberFixed")
@Order(attributes = {"name"})
@Convert(TypeNumberFixed.FixConverter.class)
class TypeNumberFixed {
    @Attribute(required = false)
    protected String name;

    @Element(required = false, name = "value")
    protected BigDecimal value;


    public static class FixConverter implements Converter<TypeNumberFixed> {

        @Override
        public TypeNumberFixed read(InputNode inputNode) throws Exception {
            //Implement your own deConverter
            return null;
        }

        @Override
        public void write(OutputNode node, TypeNumberFixed value) throws Exception {
            node.setAttribute("name",value.name);
            OutputNode valueNode = node.getChild("value");
            if (value.value != null) {
                valueNode.setValue(value.value.toPlainString());
            } else {
                valueNode.setAttribute("xsi:nil", "true");
            }
        }
    }
}

这将分别为空/非空生成以下输出:

typeNumberFixed.value = null

<TypeNumberFixed name="new_empty">
   <value xsi:nil="true"/>
</TypeNumberFixed>

typeNumberFixed.value = 30

<TypeNumberFixed name="new">
   <value>30</value>
</TypeNumberFixed>

Here's如果您有兴趣,请回复。