如何创建没有入口的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>
我需要像这样使用 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>