Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';JAXB写出SWT小部件?_Java_Xml_Jaxb - Fatal编程技术网

Java 为什么';JAXB写出SWT小部件?

Java 为什么';JAXB写出SWT小部件?,java,xml,jaxb,Java,Xml,Jaxb,我有一个类来存储SWT小部件的列表 @XmlRootElement class Test { private List<Widget> widgets; public List<Widget> getWidgets() { return widgets; } public void setWidgets(List<Widget> widgets) { this.widgets = widget

我有一个类来存储SWT小部件的列表

@XmlRootElement
class Test {
    private List<Widget> widgets;

    public List<Widget> getWidgets() {
        return widgets;
    }

    public void setWidgets(List<Widget> widgets) {
        this.widgets = widgets;
    }
}
这是输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test>
    <widgets/>
    <widgets/>
    <widgets/>
</test>

由于SWT小部件类没有JAXB注释,您需要用自己的小部件详细信息类(有注释)替换类中的注释,或者为将小部件映射到自己的详细信息类的属性实现
XmlJavaTypeAdapter

您可能还想使用

    @XmlElement(name = "widget")

因此,您得到的是
而不是

,因为SWT小部件类没有JAXB注释,您需要用自己的小部件详细信息类(有注释)替换类中的注释,或者为将小部件映射到自己的详细信息类的属性实现
XmlJavaTypeAdapter

您可能还想使用

    @XmlElement(name = "widget")
因此,您得到的是
而不是

您的实现无法使用反射来确定
小部件的子类,因此您需要在创建JAXBContext时包含它们

JAXBContext context = JAXBContext.newInstance(Test.class, Button.class, Label.class);
您的实现无法使用反射来确定
Widget
的子类,因此在创建JAXBContext时需要包含它们

JAXBContext context = JAXBContext.newInstance(Test.class, Button.class, Label.class);

试试xstream试试xstream你是说我需要详细写下所有注释?SWT由许多小部件组成,因此我必须“记录”它们才能解析它?@humansg,SWT小部件没有定义它们的XML映射,这是非常正确的——如果它们定义了,肯定会有人尝试序列化它们。如何序列化回调?@humansg sorry没有查看Widget类,因此不知道您的最佳选择是什么-也许您可以更详细地描述希望包含在XMLJAXB(JSR-222)实现中的Widget的哪些属性不需要对模型类进行任何注释:@BlaiseDoughan谢谢,然后我学到了一些东西-只是用我们正在使用的impl尝试了一下,只要父(根)类被注释,它就可以工作。你的意思是我需要详细地写下所有注释?SWT由许多小部件组成,因此我必须“记录”它们才能解析它?@humansg,SWT小部件没有定义它们的XML映射,这是非常正确的——如果它们定义了,肯定会有人尝试序列化它们。如何序列化回调?@humansg sorry没有查看Widget类,因此不知道您的最佳选择是什么-也许您可以更详细地描述希望包含在XMLJAXB(JSR-222)实现中的Widget的哪些属性不需要对模型类进行任何注释:@BlaiseDoughan谢谢,然后我学到了一些东西-只是用我们正在使用的impl尝试了一下,只要父(根)类被注释,它就可以工作。但是
org.eclipse.swt.widgets.Widget
是一个抽象的超类(),所以你的
widgets
属性包含
Widget
的子类。您的
JAXBContext
需要以某种方式创建,以便它能够识别这些子类。我尝试将实际类放入其中,但它给了我
IllegalAnnotationExceptions
我认为唯一的方法是定义自己的注释,如下所述。。我将尝试更改我的设计..但是
org.eclipse.swt.widgets.Widget
是一个抽象的超类(),因此您的
widgets
属性包含
Widget
的子类。您的
JAXBContext
需要以某种方式创建,以便它能够识别这些子类。我尝试将实际类放入其中,但它给了我
IllegalAnnotationExceptions
我认为唯一的方法是定义自己的注释,如下所述。。我将尝试改变我的设计。。