Xsd 在使用JAXB解组对象进行克隆时,如何保持IDREF链接?
我使用XSD模型定义对象,并使用Jaxb创建相应的类,以便能够在类的实例上加载XML文件,并从类的实例生成XML文件 我在XSD模型上定义的元素很复杂,有几个层次结构,使用list、ID和IDREF 我的程序的一个命令是复制元素 我不能使用clone方法,因为元素的类是由JAXB生成的。 因此,我尝试使用BeanUtils.cloneBean进行深度复制,然后使用Apache中的SerializationUtils.clone进行深度复制,但由于它们的复杂性,这两种方法不能正确地处理我的所有对象 我找到了一个可行的解决方案,使用JAXB创建一个克隆,对我的元素进行解组: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进行深度复制,但由于它们的复杂性,这两种方法不能正确地处理我的所有对象
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结构,您还可以指定自己的复制策略免责声明:我是作者
- 实施并注册您自己的
,请参阅。这将允许您插入自己的ID解析策略IDResolver