0

谁能告诉我为什么我的反序列化器不工作?

主.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());
    }

数据.xml:

<Data>

    <Pkmn> 
        <nm>Beedrill</nm> 
        <tp>bug</tp> 
        <ablt>swarm</ablt>
        <wkns>fire</wkns>
        <img>beedrill</img>
    </Pkmn> 

</Data>

口袋妖怪.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;
    }
}

数据.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;           
    }
}

堆栈跟踪:

堆栈跟踪

4

1 回答 1

1

好吧,这里有几件事值得指出:

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

@Element(name="Pkmn") private Pokemon pokemon;

上次我检查时,SimpleXML 确实支持自动绑定,但这需要@Default注释并且字段名称必须与 xml 标签匹配。

话虽如此,这里最安全的选择是不使用@Default每个注释并明确提供名称。也就是说,遍历您的Pokemon类并声明每个@Element注释的名称。例如:

...
@Element(name="ablt") private String abilities;
...

在那之后,你应该接近有工作代码。要清理,您可能希望strict=false从类的@Root声明中删除Data。那可能是您最初尝试绕过ValueRequiredException? 如果Data没有标签的Pkmn标签是有效的场景,那么可能会将其保留在那里,否则您应该将其删除以避免不希望的副作用。

于 2013-10-22T18:30:54.457 回答