当前位置:首页 » 服务器技术
开发技术指南» 文章正文
    引言: 首先要了解java默认的序列化行为,java将一切关于对象的信息都保存了下了,也就是说,有些时候那些不需要保存的也被保存了下来。
 

 

 ·j2se 1.5 in a nutshell 中文版(1)    »显示摘要«
    摘要:java2平台标准版(j2se)1.5版本(代号"tiger")是对java平台和语言的下一个重要修改;目前1.5版本的j2se包含了15个jsr的请求,相应的jcp导致了将近100个显著的修改.看到这个版本带来了这么多激动人心的变动,你可能想知道你应该从哪里开始.和以往的发布一样,所有的改动都会有一个清晰的列表保存在"release notes guide".这篇来自j2se开发团队的文章将带领......
 ·j2se中的序列化详解(三)(1)    »显示摘要«
    摘要:首先要了解java默认的序列化行为,java将一切关于对象的信息都保存了下了,也就是说,有些时候那些不需要保存的也被保存了下来。一般情况下,我们仅仅需要保存逻辑数据就可以了。不需要保存的数据我们可以用关键字transient标出。 以下是一个例子: import java.io.*; public class serial implements serializable {  int ......


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

import java.io.*; 【程序编程相关:创建访问非Oracle文件的外部表格

以下是一个例子: 【推荐阅读:优化Oracle网络设置

 int company_id; 【扩展信息:在Oracle9i中计算时间差

public class serial implements serializable {

 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来实现.下面我们验证一下.
...   下一页
 ·j2se中的序列化详解(一)    »显示摘要«
    摘要:java中处处体现着简单的程序设计风格,序列化作为最常用的功能之一,在java中的设计尤为“简单”。在objectinputstream 和objectoutputstream的帮助下,我们可以轻松的实现序列化。 只要我们的class 实现了java.io.serializable接口,就可以利用objectoutputstream的writeobject()方法将一个对象序列化;利用object......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE