0

デシリアライザーが機能しない理由を誰か教えてもらえますか?

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

データ.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;
    }
}

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

スタックトレース:

スタックトレース

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 に答える