JAXB可以将类名存储在XML中,以便反序列化代码不需要知道该类吗?

时间:2010-12-29 21:32:43

标签: java xml-serialization jaxb

反序列化JAXB XML的标准方法似乎是在创建上下文时指定包名。然后,JAXB根据根元素查找类:

JAXBContext jc = JAXBContext.newInstance("com.foo");
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal(new StringReader("<?xml version="1.0" encoding="UTF-8"     standalone="yes"?><MyJaxb>..."));

我正在寻找一种更灵活的方法,我不必指定包名称,仍然可以反序列化任何对象。这就像JAXB将包存储在XML中一样简单,但我似乎无法找到如何执行此操作。我可以编写代码来自己做,但那会很不愉快。如果可能的话,它希望JAXB能够做到这一点。顺便说一句,我不是使用模式,只是注释和编组/解组。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

获取jaxbcontext对象的实例时,应该能够添加多个包。您可以根据需要添加任意数量的包。

JAXBContext jc = JAXBContext.newInstance("com.foo.package1:com.foo.package2" ); 

但是,如果您将其反序列化为Object实例,我不确定您将如何使用它? 你不会使用你刚刚反序列化的东西吗?

如果你的应用程序是多线程的,那么Unmarshaller也不是一个线程安全的类。

答案 1 :(得分:1)

实际上你不能用纯JAXB反序列化“任何”对象。你必须指定任何一个包(将要求ObjectFactory.class)或类似JAXBContext.newInstance(Class1.class, Class2.class, Class3.class);这样的类列表。这就是jaxb的工作原理,它是协议的一部分。 如果您的任务范围更广,例如从任意xml数据结构构建java类 - 它也是可能的,但你必须更具体一点 - 你在“更灵活的方法”下是什么意思。