WEB开发网
开发学院WEB开发Jsp 谈谈J2SE中的序列化(三) 阅读

谈谈J2SE中的序列化(三)

 2008-01-05 08:54:20 来源:WEB开发网   
核心提示:谈谈J2SE中的序列化(三) 作者:Favo yang favoyang@yahoo.com 何时接受默认的java序列化行为 首先要了解java默认的序列化行为,java将一切关于对象的信息都保存了下了,谈谈J2SE中的序列化(三),也就是说,有些时候那些不需要保存的也被保存了下来,你当然希望老版本和新版本保持兼容

谈谈J2SE中的序列化(三)
作者:Favo yang 
 favoyang@yahoo.com

何时接受默认的java序列化行为

首先要了解java默认的序列化行为,java将一切关于对象的信息都保存了下了,也就是说,有些时候那些不需要保存的也被保存了下来。一般情况下,我们仅仅需要保存逻辑数据就可以了。不需要保存的数据我们可以用要害字transient标出。

以下是一个例子:

import java.io.*;

public class Serial implements Serializable {

   int company_id;

   String company_addr;

   transient boolean company_flag;

}

   则company_flag字段将不会参与序列化与反序列化,但同时你也增加了为他初始值的责任。这也是序列化经常导致的问题之一。因为序列化相当于一个只接受数据流的public构造函数,这种对象构造方法是语言之外的。但他仍然是一种形式上的构造函数。如若你的类不能够通过其他方面来保证初始化,则你需要额外的提供readObject方法,首先正常的反序列化,然后对transient标示的字段进行初始化。

   在不适合的时候,使用java默认的序列化行为可能会带来速度上的影响,最糟糕的情况是,可能导致溢出。在某些数据结构的实现中,经常会充斥着各种的循环引用,而java的默认序列化行为,并不了解你的对象结构,其结果就是java试图通过一种昂贵的“图遍历”来保存对象状态。可想而知,不但慢而且可能溢出。这时候你就要提供自己的readObject,来代替默认的行为。

兼容性问题
兼容性历来是复杂而麻烦的问题。

不要兼容性:

   首先来看看假如我们的目的是不要兼容性,应该注重哪些。不要兼容性的场合很多,比如war3每当版本升级就不能够读取以前的replays。

   兼容也就是版本控制,java通过一个名为UID(stream unique identifier)来控制,这个UID是隐式的,它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的。假如UID不一样的话,就无法实现反序列化了,并且将会得到InvalidClassException。

   当我们要人为的产生一个新的版本(实现并没有改动),而抛弃以前的版本的话,可以通过显式的声名UID来实现:

   PRivate static final long serialVersionUID=????;

你可以编造一个版本号,但注重不要重复。这样在反序列化的时候老版本将得到InvalidClassException,我们可以在老版本的地方捕捉这个异常,并提示用户升级的新的版本。

当改动不大时,保持兼容性(向下兼容性的一个特例):

   有时候你的类增加了一些无关紧要的非私有方法,而逻辑字段并不改变的时候,你当然希望老版本和新版本保持兼容性,方法同样是通过显式的声名UID来实现。下面我们验证一下。

   老版本:

import java.io.*;

public class Serial implements Serializable {

   int company_id;

   String company_addr;

  public Serial1(int company_id, String company_addr) { 
      this.company_id = company_id; 
      this.company_addr = company_addr; 
   }

public String toString() {

   return "DATA: "+company_id+" "+

company_addr;

   }

}

   新版本

import java.io.*;

public class Serial implements Serializable {

   int company_id;

   String company_addr;

  public Serial1(int company_id, String company_addr) { 
      this.company_id = company_id; 
      this.company_addr = company_addr; 
   }


Tags:谈谈 JSE 序列化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接