简单框架XML反序列化ValueRequiredException

时间:2013-10-22 17:27:00

标签: java android parsing simple-framework serializer

有谁能告诉我为什么我的解串器无效?

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

堆栈追踪:

Stack_trace

1 个答案:

答案 0 :(得分:1)

嗯,这里有一些值得指出的事情:

首先,您已注释pokemon类中的Data字段,但除非您提供字段应绑定到的xml标记的名称,否则这不会起作用。 SimpleXML不会知道您实际上是指绑定Pkmnpokemon。简而言之,添加:

@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标记是有效方案,则可能会将其保留在那里,否则您应将其删除以避免不良副作用。