java序列化

来源:互联网 发布:淘宝时尚的店铺 编辑:程序博客网 时间:2024/06/08 13:38

======================================================
注:本文源代码点此下载
======================================================

package froest.serializable.externalizable;

import java.io.externalizable;

import java.io.fileinputstream;

import java.io.fileoutputstream;

import java.io.ioexception;

import java.io.objectinput;

import java.io.objectinputstream;

import java.io.objectoutput;

import java.io.objectoutputstream;

/**

* 用externalizable实现对象的序列化

* 1.需要在readobject中对需要恢复的对象进行读取,否则数据都是取自默认构造器中

* 2.如果readobject中读取了需要的数据,那么即使默认构造器对该数据进行了改变,

*也是无效的,保存什么数据,就输出什么数据,

* 3.如果在构造器(非默认)中某个属性未初始化,那么这个属性会赋值为0或者null序列化,

*当读取数据的时候即使默认构造器对这个数据进行了初始化,也是没用的,属性的值依旧是

*读取出来的0或者null

* @author froest

*

*/

public class blip3 implements externalizable {

private inti;

private string s;

public blip3(){

this.i = 3;

system.out.println("blip3 constructor");

}

public blip3(int i,string s){

system.out.println("blip3(int ,string)");

this.i = i+1;

this.s = s;

}

public string tostring(){

return s + " " + i;

}

public void readexternal(objectinput in) throws ioexception,

classnotfoundexception {

system.out.println("readexternal");

/**

* 1.如果把in.readint()注释掉,那么程序运行时将报错java.io.optionaldataexception

*而去掉注释,那么又是可以的,说明序列化后的对象属性必须按顺序读取,第一个属性取完了

*才能取第二个属性,而且如果第一个属性未被读取,第二个属性也是不可以被读取的

* 2.如果i的值需要使用默认构造器来重新初始化,那么可以用in.readint()来去除第一个值,但是不赋值给i

*这样既可以取得序列化对象中得下一个属性值,又可以用默认构造器来重新给i赋值

*/

i = in.readint();

s = (string)in.readobject();

}

public void writeexternal(objectoutput out) throws ioexception {

system.out.println("writeexternal");

out.writeint(i);

out.writeobject(s);

}

/**

* @param args

*/

public static void main(string[] args) {

system.out.println("constructor objects");

blip3 blip3 = new blip3(47,"a string");

system.out.println(blip3);

try{

system.out.println("save object");

objectoutputstream out = new objectoutputstream(new fileoutputstream("blip3.out"));

out.writeobject("save blip3");

out.writeobject(blip3);

out.close();

system.out.println("read object");

objectinputstream in = new objectinputstream(new fileinputstream("blip3.out"));

/**

*string ss = (string)in.readobject();这行代码必须存在,如果我注释

*或者放到blip3 b = (blip3)in.readobject();之后,那么都将报错,由此可以判断

*序列化到文件是有顺序的,必须什么顺序存入,就什么顺序取出,如果之前那个不取出,

*下一个也不能被取出

*/

string ss = (string)in.readobject();

blip3 b = (blip3)in.readobject();

system.out.println(ss);

system.out.println(b);

}catch(exception e){

e.printstacktrace();

}

}

}


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击