如何在没有条目的情况下创建ElementMap?

时间:2017-03-20 09:49:16

标签: java android simple-framework

我需要使用simlexml序列化这样的Map对象:

<attributes>
   <name>name1</name>
   <value>value1</value>
   <name>name2</name>
   <value>value2</value>
   <name>name3</name>
   <value>value3</value>
</attributes>

我试过了:

@ElementMap(name = "attributes", key = "name", value = "value", inline = true, required = false)
private HashMap<String, String> attributes;

但结果如下:

   <entry>
      <name>name1</name>
      <value>value1</value>
   </entry>
   <entry>
      <name>name2</name>
      <value>value2</value>
   </entry>
   <entry>
      <name>name3</name>
      <value>value3</value>
   </entry>

这可以使用simplexml创建我需要的元素吗?

2 个答案:

答案 0 :(得分:0)

不,XML需要标签来查看哪个部分是元素。 但是......带有标签的问题是什么?

答案 1 :(得分:0)

runefist 注意到时,将为此类型生成条目标记。但您可以做什么:使用Converter自定义(反)序列化过程。

这是序列化的示例类:

@Root(name = "Example")
public class Example
{
    @Element
    @Convert(ExampleConverter.class)
    private HashMap<String, String> attributes; // Will use the Converter instead

    // ...

    public static class ExampleConverter implements Converter<HashMap<String, String>>
    {
        @Override
        public HashMap<String, String> read(InputNode node) throws Exception
        {
            // Implement if needed
        }


        @Override
        public void write(OutputNode node, HashMap<String, String> value) throws Exception
        {
            value.forEach((k, v) -> {
                try
                {
                    node.getChild("name").setValue(k);
                    node.getChild("value").setValue(v);
                }
                catch( Exception ex )
                {
                    // Handle Error
                }
            });
        }

    }
}

如果您还需要反序列化您的课程,则只需实施read()方法。

最后,不要忘记启用AnnotationStrategy

Serializer ser = new Persister(new AnnotationStrategy());
                               //  ^^^^^^^^^^^^^^^^^^^^ 

这将产生以下输出:

<Example>
   <attributes>
      <name>name2</name>
      <value>value2</value>
      <name>name1</name>
      <value>value1</value>
      <name>name0</name>
      <value>value0</value>
   </attributes>
</Example>