2013-10-22 70 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

謝謝先生。鍛鍊了魅力。 –