Java 将JiBX绑定到包含多种对象类型的列表的JAXB POJO?

Java 将JiBX绑定到包含多种对象类型的列表的JAXB POJO?,java,binding,jaxb,xml-serialization,jibx,Java,Binding,Jaxb,Xml Serialization,Jibx,问题:如何将JiBX绑定到包含多种对象类型的列表的JAXB POJO 背景:为了提高性能,我们正在尝试从JAXB迁移到JiBX进行XML序列化。但是,我们不能更改从JAXB生成的POJO,因为它们是由我们的客户提供的。我在如何调整我的binding.xml以使用从JAXB生成的List类型方面遇到了问题(JAXB生成的列表没有setter) 下面是XSD代码段 <xs:element name="contact_plan"> <xs:complexType>

问题:如何将JiBX绑定到包含多种对象类型的列表的JAXB POJO

背景:为了提高性能,我们正在尝试从JAXB迁移到JiBX进行XML序列化。但是,我们不能更改从JAXB生成的POJO,因为它们是由我们的客户提供的。我在如何调整我的
binding.xml
以使用从JAXB生成的
List
类型方面遇到了问题(JAXB生成的列表没有setter)

下面是XSD代码段

<xs:element name="contact_plan">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="header" maxOccurs="1"/>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="ctp:asc_node" maxOccurs="unbounded"/>
                <xs:element ref="ctp:desc_node" maxOccurs="unbounded"/>
                <xs:element ref="ctp:exit_umbra" maxOccurs="unbounded"/>
                <xs:element ref="ctp:enter_umbra" maxOccurs="unbounded"/>
                <xs:element ref="ctp:contact" maxOccurs="unbounded"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>
* * * *列表中允许以下类型的对象 *{@linkd} *{@link Ex} *{@linka} *{@link En} *{@link C} * * */ 公共列表getAs(){ if(as==null){ as=新的ArrayList(); } 把这个还给我; } JiBX希望在绑定中执行此操作:


生成的JAXB POJO上不存在
setAs
方法。因此,异常
错误:在类中找不到具有适当类型参数的非静态set方法setAs。
被抛出,我无法创建绑定。JiBX生成的POJO对于每种类型都有单独的列表,而不是所有类型都有一个列表

我所尝试的:


  • 我探索了为PlanXSD元素类型创建自己的封送拆收器和解封送拆收器的选项。但是,然后(据我所知),我还必须为列表中包含的每个类型编写自定义封送拆收器/解封送拆收器(您是否进行了基准测试,以了解切换到JiBX是否会获得性能优势?您需要考虑支持此用例所需的任何解决方案。XML绑定在您的执行过程中占很大一部分吗?通过网络发送XML通常会大大超过将对象转换为XML所需的时间。@Blaiser)我们主要感兴趣的是从接收XML到用户可以使用更新之间所需的处理时间。我们已经完成了分析,发现大约30%的CPU时间用于对文档进行解组。建议使用JiBX来提高解组性能。目前,它是我们需要一个原型来看看我们使用JiBX的效果有多好。您可以做一些事情来确保最大限度地利用JAXB性能:1)
    JAXBContext
    是线程安全的,因此请确保创建一个并重用它。2)不同源的解组性能不同,我建议从
    XMLStreamReader
    (尝试Woodstox实现)中解组。3) 禁用架构验证,除非您确实需要它,因为它会减慢解组速度。@BlaiseDoughan我们正在执行所有这些操作,但禁用验证除外。
    /**
     * Gets the value of the a property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the a property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getAs().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link D }
     * {@link Ex }
     * {@link A }
     * {@link En }
     * {@link C }
     * 
     * 
     */
    public List<Object> getAs() {
        if (as == null) {
            as = new ArrayList<Object>();
        }
        return this.as;
    }
    
    <mapping class="c" name="c">
      <structure type="c" get-method="getHeader" set-method="setHeader"/>
      <collection get-method="getAs" set-method="setAs"
                  create-type="java.util.ArrayList">
      </collection>
    </mapping>