gpt4 book ai didi

java - Simple 2.6.7 处理枚举的方式与 Simple 2.6 不同吗?

转载 作者:行者123 更新时间:2023-11-30 09:29:44 30 4
gpt4 key购买 nike

考虑以下用 simple-xml 注释注释的枚举:

@Root(name="days")
public enum DaysOfWeek {

SUNDAY("blue", 30),
MONDAY("green", 60),
TUESDAY("yellow", 50),
WEDNESDAY("red", 45),
THURSDAY("black", 45),
FRIDAY("white", 65),
SATURDAY("brown", 40);

@Attribute(name="color")
private String color;

@Element(name="mins")
private int minutes;


DaysOfWeek(String color, int minutes){
this.color = color;
this.minutes = minutes;
}

DaysOfWeek(){
/*
* Default constructor
*/
}

public void setColor(String color){
this.color = color;
}

public void setMinutes(int minutes){
this.minutes = minutes;
}

public String getColor(){
return this.color;

}

public int getMinutes(){
return this.minutes;
}
}

并且,使用简单框架将其序列化为 XML 的代码:

    StringWriter writer = new StringWriter();
try {
serializer.write(DaysOfWeek.TUESDAY, writer);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(writer.toString());

使用 simple-2.6,我看到了这个输出——这正是我所期望的:

<days color="yellow">
<mins>50</mins>
</days>

但是,相同的代码,当使用 simple-2.6.7 序列化时,会给出:

<daysOfWeek>TUESDAY</daysOfWeek>

基本上,在 simple-2.6.7 中,枚举的各个成员(以及它们的 simple-xml 注释)被忽略,并且始终使用枚举常量的名称进行序列化。

这是故意的吗?如何获取最新版本的 simple-xml 以序列化枚举,同时考虑枚举的各个成员?

最佳答案

changelog 中只有一个条目包含enum对于 (2.6.x) 版本:

Simple 2.6.3:
- Bug fix made to ensure abstract enums can be serialized properly

但是为什么要序列化 ​​colorminutes 呢?如果您序列化和反序列化 DaysOfWeek,枚举将根据您的定义(构造函数)获取它们的值。


无论如何,您都可以使用Converter 来自定义您的 XML:

DaysOfWeek 注释:

@Root(name = "days")
@Convert(DaysOfWeekConverter.class)
public enum DaysOfWeek
{
// ...
}

注意:您不再需要@Element@Attribute 注释,此类的xml 的“内容”是现在由 Converter 指定。

(可能)Converter-接口(interface)的实现:

public class DaysOfWeekConverter implements Converter<DaysOfWeek>
{
@Override
public DaysOfWeek read(InputNode node) throws Exception
{
DaysOfWeek rtn = getDayByColor(node.getAttribute("color").getValue());
rtn.setMinutes(Integer.valueOf(node.getNext("mins").getValue()));

return rtn;
}


@Override
public void write(OutputNode node, DaysOfWeek value) throws Exception
{
node.setName("days");
node.setAttribute("color", value.getColor());
node.getChild("mins").setValue("" + value.getMinutes());
}


private DaysOfWeek getDayByColor(String color)
{
for( DaysOfWeek value : DaysOfWeek.values() )
{
if( value.getColor().equals(color) )
return value;
}

throw new IllegalArgumentException("No Day available for color \'" + color + "\'");
}
}

(示例) 使用转换器:

/*
* Setting 'AnnotationStrategy' is requried here - else the Converter will get ignored.
*/
Serializer ser = new Persister(new AnnotationStrategy());

StringWriter sw = new StringWriter();
ser.write(DaysOfWeek.TUESDAY, sw);

// ...

StringReader sr = new StringReader(sw.toString());
DaysOfWeek day = ser.read(DaysOfWeek.class, sr);

// ...

序列化 XML (来自示例):

<days color="yellow">
<mins>50</mins>
</days>

文档:

关于java - Simple 2.6.7 处理枚举的方式与 Simple 2.6 不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13563188/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com