2013-10-22 46 views
0

任何人都可以告诉我为什么我的反序列化器不工作?简单框架XML反序列化ValueRequiredException

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

嗯,有几件事情值得指出的是在这里:

首先,你注释在Data类的pokemon场,但是这是除非您提供字段应该绑定的xml标记的名称,否则不会工作。 SimpleXML不会知道你实际上是指绑定Pkmnpokemon。总之,添加:

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

我最后一次检查,SimpleXML的不支持自动绑定,但是这将需要@Default annotation和字段名称必须符合XML标记。

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

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

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

+0

谢谢先生。锻炼了魅力。 –