XStream 是一个简单的库,用于将对象序列化为 XML 并返回。它不需要任何映射,并能生成干净的 XML。

关于 XStream 的更多信息,请看 XStream 网站。Spring 集成类位于 org.springframework.oxm.xstream 包中。

使用 XStreamMarshaller

XStreamMarshaller 不需要任何配置,可以直接在应用程序上下文中进行配置。为了进一步定制 XML,你可以设置一个别名映射,它由映射到类的字符串别名组成,如下例所示:

  1. <beans>
  2. <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
  3. <property name="aliases">
  4. <props>
  5. <prop key="Flight">org.springframework.oxm.xstream.Flight</prop>
  6. </props>
  7. </property>
  8. </bean>
  9. ...
  10. </beans>

默认情况下,XStream 允许任意的类被解读,这可能会导致不安全的 Java 序列化效果。因此,我们不建议使用 XStreamMarshaller 来解读来自外部的 XML(也就是网络),因为这可能导致安全漏洞。

如果你选择使用 XStreamMarshaller 来解读来自外部源的 XML,请在 XStreamMarshaller 上设置 supportedClasses 属性,如下例所示:

  1. <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
  2. <property name="supportedClasses" value="org.springframework.oxm.xstream.Flight"/>
  3. ...
  4. </bean>

这样做可以确保只有注册的类才有资格被解读

此外,你可以注册 自定义转换器),以确保只有你支持的类可以被解读。你可能想添加一个 CatchAllConverter 作为列表中的最后一个转换器,此外还有明确支持应该被支持的域类的转换器。这样一来,优先级较低、可能存在安全漏洞的默认 XStream 转换器就不会被调用。

:::info 请注意,XStream 是一个 XML 序列化库,而不是一个数据绑定库。因此,它的命名空间支持有限。因此,它相当不适合在 Web 服务中使用。 :::