反序列化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能够做到这一点。顺便说一句,我不是使用模式,只是注释和编组/解组。有什么想法吗?
答案 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类 - 它也是可能的,但你必须更具体一点 - 你在“更灵活的方法”下是什么意思。