JAXB - 如何在不向上下文声明其元素名称或子类的情况下解组继承类型的列表

时间:2015-12-17 20:20:57

标签: list inheritance jaxb unmarshalling

我有一个元素列表,其中所有类型都从同一个基类继承。存在一种方法来解组它以列出但是获取其派生类型的对象但是却没有在JAXB上下文中声明所有子类或元素名称?

我的真实对象结构中包含大约150个子类,所以如果可以自动检索(希望如此),我不想进行重新输入声明的练习。

我曾尝试过" @ XmlElements,@ XmlSeeAlso,@ XmlAnyElement,@ XmlElementRef"但它们都需要列出所有元素名称或类名。

我的XML结构:

<root>
   <Cat>...</Cat>
   <Dog>...</Dog>
   ...
</root>

我的班级结构:

@XmlRootElement(name = "Cat")
class Cat extends Animal ...

@XmlRootElement(name = "Dog")
class Dog extends Animal ...

我的根类:

@XmlRootElement(name = "root")    
class Root {

   @XmlElement( ??? )
   private List<Animal> animals;
}

使用&#34; @XmlElement s &#34;会工作,但我必须声明所有已在类声明上注释的名称。所以不是150个子类的好方法。

@XmlRootElement(name = "root")    
class Root {

  @XmlElements(value={
    @XmlElement(name="Cat", type=Cat.class),
    @XmlElement(name="Dog", type=Dog.class),
    ...
   })
  private List<Animal> animals;
}    

&#34; @XmlAnyElement(不严=真)&#34;听起来不错,但后来我必须在JAXB上下文中声明所有元素名称,这也不是一个好方法。

@XmlRootElement(name = "root")    
class Root {

  @XmlAnyElement(lax=true)
  private List<Object> animals;
}  

JAXBContext.newInstance("root:Cat:Dog:...");

&#34; @ XmlSeeAlso&#34;需要在基类上声明所有子类,这对我来说也不好。

@XmlSeeAlso(Dog.class, Cat.class, ...)
public abstract class Animal ...

&#34; @ XmlElementRef将&#34;要求我至少必须列出JAXB上下文中的所有子类。因此也不适合我。

@XmlRootElement(name = "root")    
class Root {

  @XmlElementRef
  private List<Animal> animals;
}  

JAXBContext.newInstance(Root.class, Dog.class, Cat.class, ...);

还有其他提示吗?

0 个答案:

没有答案