1

オブジェクトのツリー構造を含むプログラムをJavaで作成しています。関連するすべてのクラスは同じインターフェースを実装し、各クラスには子のリストが含まれています。

public class MyClass1 implements MyInterface {    
    List<MyInterface> children;
}

public class MyClass2 implements MyInterface {    
    List<MyInterface> children;
}

public class MyClass3 implements MyInterface {    
    List<MyInterface> children;
}

....

これで、3つの構造がXMLファイルで定義されました。

<myclass1>
    <myclass2></myclass2>
    <myclass1>
        <myclass3></myclass3>
    </myclass1>
</myclass1>

ツリー構造は、ユーザーが定義した任意のタイプにすることができます。もちろん、各クラスには、今のところ省略したクラス固有の変数が含まれています。

現在、XStreamを使用してXMLファイルをJavaオブジェクトに逆シリアル化しようとしていますが、できればアノテーションを使用していますが、これを行う方法がわかりません。MyClass1のように、可能なクラスごとにリストを作成することになりたくありません。

@XStreamImplicit(itemFieldName="myclass2")
List<MyClass2> children2;
@XStreamImplicit(itemFieldName="myclass3")
List<MyClass3> children3;
@XStreamImplicit(itemFieldName="myclass4")
List<MyClass4> children4;

XStreamでこのケースを解決する方法について何か提案はありますか?または、他のテクノロジーを使用する必要がありますか?

4

1 に答える 1

0

source.xml(ロードするXMLを含む):

<myclass1>
    <myclass2></myclass2>
    <myclass1>
        <myclass3></myclass3>
    </myclass1>
</myclass1>

インターフェース

import java.util.List;

public interface Myinterface {
    List<? extends Myinterface> getChildren();
}    

抽象Beanクラス(で子を宣言する@XStreamImplicit):

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class MyAbstract implements Myinterface {
    @XStreamImplicit
    private List<? extends Myinterface> children = new ArrayList<Myinterface>();


    public List<? extends Myinterface> getChildren() {
        return children;
    }
}

Beanクラス(MyAbstractを拡張し、@XStreamAlias必要なXML文字列を使用するために使用):

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias(value="myclass1")
public class Myclass1 extends MyAbstract {

}

@XStreamAlias(value="myclass2")
public class Myclass2 extends MyAbstract {

}

@XStreamAlias(value="myclass3")
public class Myclass3 extends MyAbstract {

}

メインクラス(XMLソースファイルの読み取り。注釈付きクラスから構成をロードすることを忘れないでくださいprocessAnnotations):

import com.thoughtworks.xstream.XStream;

public class XStreamTest {
    public static void main(String[] args) {
        XStream xStream = new XStream();
        xStream.processAnnotations(Myclass1.class);
        xStream.processAnnotations(Myclass2.class);
        xStream.processAnnotations(Myclass3.class);

        Object fromXML = xStream.fromXML(XStreamTest.class.getResourceAsStream("source.xml"));
        System.out.println(fromXML);
    }
}
于 2012-08-23T12:57:42.573 に答える