对象的序列化与反序列化

(1)对象的序列化就是将Object装换成byte序列,反之叫对象的反序列化。

(2)序列化流(objectOutputStream),是字节过滤流,主要方法是writeobject()方法;反序列化流(objectInputStream),主要方法是readObject()方法。

(3)序列化接口(serializable): 对象必须实现序列化接口,才能进行序列化,否则将会出现异常。这个接口,没有任何方法,只是一个标准。

(4)用transient关键字标记的成员变量不参与序列化过程

(5)序列化中子类和父类构造函数的调用问题

       1)一个类实现了序列化接口,那么其子类都可以进行序列化;

       2)对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用。如果父类实现了序列化接口,那么其父类的构造函数不会被调用。

(6)下面这个是对象序列化和反序列化的一个简单例子,以及使用transient关键字的实验代码,也可以将transient关键字去掉运行进行对比查看

import java.io.Serializable;
public class SeriaStudent implements Serializable{
private String stuno;
private String stuname;
private transient int stuage;//该元素不会进行虚拟机默认的序列化,也可以自己完成这个元素的序列化

public SeriaStudent(){
}

public SeriaStudent(String stuno, String stuname, int stuage) {
super();
this.stuno = stuno;
this.stuname = stuname;
this.stuage = stuage;
}

 public String getStuno() {
return stuno;
}

public void setStuno(String stuno) {
this.stuno = stuno;
}

public String getStuname() {
return stuname;
}

public void setStuname(String stuname) {
this.stuname = stuname;
}

public int getStuage() {
return stuage;
}

public void setStuage(int stuage) {
this.stuage = stuage;
}

@Override
public String toString() {
return "ListStudent [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
}

//可以使用下面这两个方法自己完成被transient修饰的对象的序列化

/*private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{

s.defaultWriteObject();//把虚拟机能默认的序列化的元素进行序列化操作
s.writeInt(stuage);    //自己完成stuage的序列化
}
    private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{
    s.defaultReadObject(); //把虚拟机能默认反序列化的元素进行反序列化操作
    this.stuage=s.readInt();//自己完成stuage的反序列化操作
}*/

}

以下程序先运行序列化程序,再将序列化程序注释后运行反序列化程序。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public class ObjectSeriaDemo {

public static void main(String[] args) throws Exception {
String file="demo/obj.dat";
//1.对象的序列化
/*ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
SeriaStudent stu=new SeriaStudent("1001","张三",20);
oos.writeObject(stu);
oos.flush();
oos.close();*/
//2.对象的反序列化
       ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
SeriaStudent stu=(SeriaStudent)ois.readObject();//强制类型转化
System.out.println(stu);
ois.close();
}
}

age成员变量没有transient修饰时的运行结果


age成员变量有transient修饰时的运行结果


age成员变量有transient修饰,但是有

    private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{

         }

    private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{

}

这两个方法的运行结果



















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值