JAXBContext newInstance(class,class) explanation

3
我正在尝试了解JAXB,并希望使用JAXB初始化多个对象。我在StackOverFlow上找到了一个很好的问题和答案。

如何使用jaxb编组多个对象

所以我正在查看代码,试图理解每个部分。我认为第一个关键部分是以下行:
JAXBContext jc = JAXBContext.newInstance(JAXB2_Lists.class, JAXB2_Book.class);

浏览JAXBContext文档时,我无法确定使用了哪个newInstance方法。猜测正在使用哪一个,但我真的不理解它。

http://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBContext.html#newInstance(java.lang.Class...)

我的猜测是它正在使用以下重载。
public static JAXBContext newInstance(Class[] classesToBeBound,
                                      Map<String,?> properties)
                               throws JAXBException

参数:

classesToBeBound - 要被新的JAXBContext识别的Java类列表。

"要被识别"是什么意思?以何种方式被识别?

请教我这个问题。谢谢。


在JAXB中,对象的序列化和反序列化是有规定的方式的,因此JAXB必须知道这些类是哪些,以便将它们识别为有效的JAXB目标(并扫描它们包含的相关注释)。 - Arnaud
谢谢Berger,但是在编码示例中被序列化的是Book类,对吗?代码首先有List类,所以它是否同时序列化了List和Book类? - JamesA
是的,在您链接中的示例中,一个List被编组,其中包含Book对象(因此Books也会“级联”编组),因此两者都必须被JAXB“识别”。 - Arnaud
为什么你不把这些答案作为回答提供,这样我就可以给你点赞了呢?=) - JamesA
1个回答

1

被认为是由JAXB进行编组和取消编组的对象需要被教导哪些类是它们的,以便将其识别为有效的JAXB目标(并扫描/处理它们包含的相关注释)。

在您链接中的示例中,将编组包含Book对象的List(因此也会级联编组书籍),因此两者都必须被JAXB“认可”/“知道”。

此外,您实际调用的方法是:

public static JAXBContext newInstance(Class... classesToBeBound)

从描述中可以看出:

新上下文不仅将识别所有指定的类,还将识别从指定类静态直接/间接引用的任何类。

因为您的List引用了Book,所以我猜您可以从参数中省略Book类,并简单地调用

JAXBContext jc = JAXBContext.newInstance(JAXB2_Lists.class);

我是否正确识别了重载方法?对于要绑定的Class[]类,可以提供一个Class对象列表?那么"Map<String,?> properties"参数如何参与其中呢?从我提供的文档中,这一点并没有得到解释。感谢您的帮助。=) - JamesA
你没有调用这个方法,我更新了答案以提供更多细节。 - Arnaud
我有一个关于JAXB new instance的小疑问。我需要对不同的Maven子模块中存在的类进行解组。我知道如何在同一Maven模块或项目中传递名称,但如果这些类存在于不同的子模块中,我该如何传递名称?我需要将名称与子模块信息一起传递吗?如果是这样,您能否提供一个示例?我尝试了很多方法并搜索了很多答案,但什么都没找到。 - BATMAN_2008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接