【问题标题】:Using XStream to create a list of different objects使用 XStream 创建不同对象的列表
【发布时间】:2012-08-23 12:26:12
【问题描述】:

我正在用 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;
}

....

现在这三个结构被定义在一个 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 解决这种情况的任何建议?还是我应该使用其他技术?

【问题讨论】:

    标签: java xml tree xstream xml-deserialization


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这真的很有用!
    • @Toilal 你如何获得元素的值,它是一个类本身。除了'abc'之外,我有一个类似于上面的那个。我无法获得 myclass1=abc 的值
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多