一花一四季,一页一江湖

停不下的脚步,伴着Java成长!

BlogJava 首页 新随笔 联系 聚合 管理
  3 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

XStream常见问题解析

XStream所支持的JDK版本

XStream支持JDK1.3及以后的版本

在不同的JVMXStream运行会有差异吗?

XStream有两种运行模式:存Java模式和增强模式。

在存Java模式下,XStream在不同JVM中的运行是一样的,但由于不同JVMreflection机制的支持有所差异,会导致一些类或字段将无法序列化。

在增强模式下,XStream没有上述限制,然而这种模式并不被所有的JVM所支持。

哪种JVM支持XStream以增强模式运行?

       目前SunApple、和HPJVM 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实例已经被创建并配置后,它能够在多线程中共享允许对象并发的进行序列化和反序列化操作。
posted on 2006-02-16 13:25 魔戒 阅读(3355) 评论(1)  编辑  收藏

Feedback

# re: []XStream常见问题解析 2008-12-08 14:15 epinszteinic
对象发生改变时的解决办法:

XStream xstream = new XStream(new DomDriver()) {

protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {

public boolean shouldSerializeMember(Class definedIn, String fieldName) {
return definedIn != Object.class ? super.shouldSerializeMember(definedIn, fieldName) : false;
}

};
}

};  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: