XStream常见问题解析
XStream所支持的JDK版本
XStream支持JDK1.3及以后的版本
在不同的JVM中XStream运行会有差异吗?
XStream有两种运行模式:存Java模式和增强模式。
在存Java模式下,XStream在不同JVM中的运行是一样的,但由于不同JVM对reflection机制的支持有所差异,会导致一些类或字段将无法序列化。
在增强模式下,XStream没有上述限制,然而这种模式并不被所有的JVM所支持。
哪种JVM支持XStream以增强模式运行?
目前Sun、Apple、和HP的JVM 1.4或更新的版本支持增强模式。所有的JVM均支持以存Java模式运行。
两种模式下差异比较
仅以Sun JDK 1.4为例说明两种模式下,XStream运行的差异。
功能 存Java模式 增强模式
公有类 YES YES
非公有类 NO YES
静态内部类 YES YES
非静态内部类 NO YES
匿名静态内部类 NO YES
无缺省构造函数 NO YES
有缺省构造函数 YES YES
Private字段 YES YES
Final字段 NO YES
如何序列化集合对象?
参考下面的代码示例:
class Person {
private String name;
private List toys = new ArrayList();
// ...
}
class Computer {
String type;
}
class Car {
String color;
}
xstream.alias("person", Person.class);
xstream.alias("computer", Computer.class);
xstream.alias("car", Car.class);
Person person = new Person("Joe");
person.addToy(new Computer("apple"));
person.addToy(new Computer("spectrum"));
person.addToy(new Car("blue"));
String xml = xstream.toXML(joe);
示例返回结果:
<person>
<name>Joe</name>
<toys>
<computer>
<type>apple</type>
</computer>
<computer>
<type>spectrum</type>
</computer>
<car>
<color>blue</color>
</car>
</toys>
</person>
如果使用XStream序列化对象,对象必须要实现Serializable接口吗?
不必
动态代理类能被序列化吗?
可以
当对象发生改变时,XStream如何处理?
当对象新增加一个字段时,XStream在反序列化旧版本的对象时,会忽略这个新增的字段,不作任何处理。
当对象删除一个字段时,XStream在反序列化旧版本的对象(包含该字段)时,会抛出异常信息。
如果对象的字段改名了,将被视作删除了一个字段,然后再新增一个字段。
对于更高级别的类移植,我们在发送信息到XStream之前,必须要对XML对象进行预处理。
XStream还在不断的开发过程中,相信在未来的版本中,上述操作会更成熟,更容易。
XStream是线程安全的吗?
是的。一旦XStream实例已经被创建并配置后,它能够在多线程中共享允许对象并发的进行序列化和反序列化操作。