【问题标题】:Can JAXB store the class name in the XML so that the the deserialize code doesn't need knowledge of the class?JAXB 可以将类名存储在 XML 中,以便反序列化代码不需要类的知识吗?
【发布时间】:2010-12-29 21:32:43
【问题描述】:

似乎反序列化 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 这样做。顺便说一句,我没有使用模式,只是注释和编组/解组。有什么想法吗?

【问题讨论】:

    标签: java xml-serialization jaxb


    【解决方案1】:

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

    【讨论】:

    • 我希望能够反序列化我的类路径中的任何对象,例如:Object o = u.unmarshal(...);无需指定每个可能的包并在我添加带有新包的类时不断更新列表。所需要的只是将包名存储在 XML 中。我认为 GSON 会这样做。
    • @Andrew。反序列化并做什么?这就是问题所在。在 Java 中你不能用 Object 做很多事情,但是将它传递给 JS 可以做更多的事情。
    • 您可以用 Object 做很多事情(例如反射),而这正是我所需要的。所以看起来我的解决方案是将包名称添加到 XML 中。
    【解决方案2】:

    当您获得 jaxbcontext 对象的实例时,您应该能够添加多个包。您可以添加任意数量的包,如下所示。

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

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

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

    【讨论】:

    • 我通过 jax-rs 接收对象,然后传递给知道如何处理它们的服务。很高兴知道我可以提供多个包裹,但我认为这可能是一个维护问题。
    • 如果您只想将包名称放入属性或配置文件中。您可以再次使用上述内容并在该配置文件中定义您需要的任何包,这样您就不需要在每次需要添加新包时进行编译。这是你想做的吗?
    • 我可以这样做,但是每次添加新类时,我都必须更新该文件。自动更新它的构建脚本可以解决这个问题,但不想这样做。看起来如此简单明了,我无法想象 JAXB 没有更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2018-09-16
    • 2011-04-11
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多