【发布时间】:2009-04-10 00:25:52
【问题描述】:
我想知道将 java 对象转换为 xml 的最佳或最广泛使用的 api 是什么。我对这个主题相当陌生。是否可以进行某种 api 调用来传入对象并返回 xml?还是需要通过提取对象值来手动构造文档时更加繁琐?
我一直在阅读有关 xerces、sax 和 jaxb 的文章。我想沿着这条开源路线继续前进。
谢谢!
【问题讨论】:
标签: java xml serialization
我想知道将 java 对象转换为 xml 的最佳或最广泛使用的 api 是什么。我对这个主题相当陌生。是否可以进行某种 api 调用来传入对象并返回 xml?还是需要通过提取对象值来手动构造文档时更加繁琐?
我一直在阅读有关 xerces、sax 和 jaxb 的文章。我想沿着这条开源路线继续前进。
谢谢!
【问题讨论】:
标签: java xml serialization
JAXB 绝对是解决方案。
为什么?嗯,它在 JDK 6 中,所以你永远不会发现它无人维护。
它使用 Java 注释来为类、方法和字段声明与 XML 相关的属性。
注意:JAXB 还使您能够轻松地“解组”XML 数据 (之前是从 Java 对象实例中编组的)返回 到对象实例。
JAXB 的另一个优点是:它被其他 Java 相关的支持 技术,例如 JAX-RS(一种 Java RESTful API,可用 作为 Java EE 6 的一部分)。 JAX-RS 可以服务和接收 JAXB 动态对象,无需编组/解组它们。 您可能想查看Netbeans,其中包含 对 JAX-RS 的开箱即用支持。请阅读 this tutorial 了解入门。
编辑:
编组/解组“随机”(或外部)Java 对象,JAXB 提供了相当简单的可能性:可以声明一个 XmlAdapter 并将现有的 Java 类“包装”为与 JAXB 兼容。 此类 XmlAdapter 的使用是通过使用 @XmlJavaTypeAdapter-annotation 完成的。
【讨论】:
Tutorial 2 链接似乎已损坏。你能修好吗?谢谢
你可能想看看 XStream:http://x-stream.github.io
【讨论】:
Java 6 提供了一个将带注释的 Java 对象转换为 XML 的 API。以下代码展示了如何将带注释的对象转换为 XML 字符串
final JAXBElemento = new ObjectFactory().createElement(new Type()); final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); // 如果您希望结果更易于阅读,请执行此操作。 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(o, System.out);
您可以通过添加架构验证来进一步扩展它(注意非常慢,但对调试很有用)
final JAXBElemento = new ObjectFactory().createElement(new Type()); final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller(); 最终架构架构 = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema").newSchema( getClass().getResource("/META-INF/wsdl/schema.xsd")); m.setSchema(模式); m.marshal(o, System.out);
如果 Type 是已定义的元素,则不需要对 JAXBElement 进行类型转换。 (即有一个注解@XmlRootElement)
【讨论】:
java.beans.XMLEncoder 和 java.beans.XMLDecoder 呢?
http://www.rgagnon.com/javadetails/java-0470.html 的示例
再见。
【讨论】:
对于决定使用 JAXB 的任何人,请确保缓存 JAXBContext。众所周知,JAXBContext.newInstance 非常昂贵。我记录了一个在日志记录中使用到 xml 的转换并且没有缓存 JAXBContext.newInstance 的案例,当 20 个并发用户调用时,它会导致高达 5 秒的性能开销。
http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html
这并不是要阻止任何使用 JAXB 的人。缓存 JAXBContext 后,性能非常好,如上面的链接所述。
【讨论】:
XMLBeans 是另一个,类似于 JAXB。我有一段时间没有看 JAXB,当我这样做时,它与 XMLBeans 相比相当糟糕,但那是几年前的事了(我更喜欢使用 JDK 中的东西而不是 3rd 方的东西,但我仍然使用XMLBeans 直到今天)。
【讨论】: