如何创建没有入口的ElementMap?

How to create ElementMap without entry?

我需要像这样使用 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 创建我需要的元素?

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

runefist 所述,将为该类型生成入口标签。但是您可以做什么:使用 Converter.

自定义(反)序列化过程

下面是一个 class 序列化示例:

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

    }
}

如果你还需要反序列化你的class,你只需要实现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>