有谁能告诉我为什么我的解串器无效?
Main.java
try {
Serializer serializer = new Persister();
AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open("data.xml");
Data d = serializer.read(Data.class, inputStream);
System.out.println("[JOE]: "+d.getPokemon().getName());
}
catch (Exception e) {
e.printStackTrace();
System.out.println("[JOE] error: "+e.getMessage());
}
data.xml中:
<Data>
<Pkmn>
<nm>Beedrill</nm>
<tp>bug</tp>
<ablt>swarm</ablt>
<wkns>fire</wkns>
<img>beedrill</img>
</Pkmn>
</Data>
Pokemon.java:
package com.example.pokemon;
import java.io.Serializable;
import org.simpleframework.xml.Element;
//import org.simpleframework.xml.Element;
public class Pokemon implements Serializable{
@Element
private String name;
@Element
private String type;
@Element
private String abilities;
@Element
private String weakness;
@Element
private String image;
public Pokemon(){}
public Pokemon(String n, String t, String a, String w, String i){
name = n;
type = t;
abilities = a;
weakness = w;
image = i;
}
public String getName(){
return name;
}
}
Data.java:
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root(name="Data", strict=false)
public class Data {
@Element
private Pokemon pokemon;
public Pokemon getPokemon() {
return pokemon;
}
}
堆栈追踪:
答案 0 :(得分:1)
嗯,这里有一些值得指出的事情:
首先,您已注释pokemon
类中的Data
字段,但除非您提供字段应绑定到的xml标记的名称,否则这不会起作用。 SimpleXML不会知道您实际上是指绑定Pkmn
到pokemon
。简而言之,添加:
@Element(name="Pkmn") private Pokemon pokemon;
上次我检查过,SimpleXML支持自动绑定,但这需要@Default
annotation,字段名称必须与xml标记匹配。
话虽如此,这里最安全的选择是不使用@Default
并明确地为每个注释提供名称。也就是说,浏览一下Pokemon
类并为每个@Element
注释声明名称。例如:
...
@Element(name="ablt") private String abilities;
...
之后,你应该接近有工作代码。要清理,您可能需要从strict=false
课程的@Root
声明中删除Data
。这可能是您最初绕过ValueRequiredException
的尝试?如果Data
标记没有Pkmn
标记是有效方案,则可能会将其保留在那里,否则您应将其删除以避免不良副作用。