Xsd 在使用JAXB解组对象进行克隆时,如何保持IDREF链接?

Xsd 在使用JAXB解组对象进行克隆时,如何保持IDREF链接?,xsd,jaxb,clone,unmarshalling,deep-copy,Xsd,Jaxb,Clone,Unmarshalling,Deep Copy,我使用XSD模型定义对象,并使用Jaxb创建相应的类,以便能够在类的实例上加载XML文件,并从类的实例生成XML文件 我在XSD模型上定义的元素很复杂,有几个层次结构,使用list、ID和IDREF 我的程序的一个命令是复制元素 我不能使用clone方法,因为元素的类是由JAXB生成的。 因此,我尝试使用BeanUtils.cloneBean进行深度复制,然后使用Apache中的SerializationUtils.clone进行深度复制,但由于它们的复杂性,这两种方法不能正确地处理我的所有对象

我使用XSD模型定义对象,并使用Jaxb创建相应的类,以便能够在类的实例上加载XML文件,并从类的实例生成XML文件

我在XSD模型上定义的元素很复杂,有几个层次结构,使用list、ID和IDREF

我的程序的一个命令是复制元素

我不能使用clone方法,因为元素的类是由JAXB生成的。 因此,我尝试使用BeanUtils.cloneBean进行深度复制,然后使用Apache中的SerializationUtils.clone进行深度复制,但由于它们的复杂性,这两种方法不能正确地处理我的所有对象

我找到了一个可行的解决方案,使用JAXB创建一个克隆,对我的元素进行解组:

public ObjectXML duplicate(ObjectXML objectXML) throws JAXBException {

  JAXBContext sourceJaxbContext = JAXBContext.newInstance(objectXML.getClass());
  JAXBContext targetJaxbContext = JAXBContext.newInstance(objectXML.getClass());

  Unmarshaller unmarshaller = targetJaxbContext.createUnmarshaller();

  ObjectXML objectCopy = (ObjectXML) unmarshaller.unmarshal(new JAXBSource(sourceJaxbContext, objectXML));

  return objectCopy;
}
ObjectXML是JAXB生成的所有元素的父类。所有元素都直接或间接从此类继承

除了链接到另一个对象的IDREF属性外,该方法工作得很好:当我解组单个对象时,JAXB不知道具有相应ID的元素,因此它将null分配给该属性

当链接对象未提供给JAXB的解组器时,是否有人能提供一种解决方案来保持副本上的IDREF

谢谢你提前通知。

几点提示

  • 从中尝试插件。该插件生成无深度反射的复制方法,可以很好地处理JAXB结构,您还可以指定自己的复制策略免责声明:我是作者
  • 实施并注册您自己的
    IDResolver
    ,请参阅。这将允许您插入自己的ID解析策略

实现和使用IDResolver正是我所需要的。它工作得很好。非常感谢你。