java对象串行化_Java IO流中的对象串行化

将Java程序中的对象保存在外存(除了CUP缓存、内存)当中,称为对象永久化。

Java中有两种类型的字节流可以实现对象永久化。ObjectInputStream、 ObjectOutputStream 支持对象的读和写。

对象永久化的关键是将它的状态以一种串行格式表示出来,以便以后读取该对象时能够把它重构。

因此对Java对象读写的过程被称为对象串行化。

把对象写入文件中保存,并把对象读取到标准输出(即屏幕中);

importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutput;importjava.io.ObjectOutputStream;importjava.util.Date;public classDemo {public static voidmain(String[] args) {

String address= new String("D:"+File.separator+"text.txt");

Date day= newDate();try{

ObjectOutputStream oout= new ObjectOutputStream(newFileOutputStream(address));

oout.writeObject(day);

oout.close();

}catch(IOException e) {

System.out.println(e.getMessage());

}

day= null;try{

ObjectInputStream oin= new ObjectInputStream (newFileInputStream(address));

day=(Date)oin.readObject();

oin.close();

System.out.println(day);

}catch(IOException e) {

System.out.println(e.getMessage());

}catch(ClassNotFoundException e) {

System.out.println(e.getMessage());

}

}

}

构造可串行化对象的类

一个类只有实现了Serializable 他的对象才是可以串行化的。

如果你写的类要串行化,必须实现Serializable接口。

实际上Serializable是一个空接口,它只是简单的标识一个类的对象可以被串行化。

在对象进行串行化时,只有对象的数据被保存,该对象所属类方法与构造方法不在串行化的流中。

可串行化类变量的访问劝你先拿对于数据的串行化没有影响。数据一般是以字节写入流,而字符串型数据将表示为UTF格式。

定制串行化:

1. 仅对可串行化类自己定义的数据输出进行定制,这称为部分定制串行化。

2. 对可串行化类所有的数据(包括父类)的输出进行定制 这称为完全定制串行化。

部分定制串行化:   (Serializable)

只需要定义并实现两个方法。writeObject() 、readObject()

完全定制串行化:      (Externalizable)

需要实现Externalizable接口。

Externalizable接口 实现了Serializable。

必须要定义一个具有public访问权限不带参数的构造器;

代码DEMO;

importjava.io.Externalizable;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInput;importjava.io.ObjectInputStream;importjava.io.ObjectOutput;importjava.io.ObjectOutputStream;importjava.util.Date;public classObjecttext {public static voidmain(String[] args) {

ManagerExtern manager= new ManagerExtern(1,"A",1,2,"00/00/00","intel","teamleader");

ManagerExtern manager1= new ManagerExtern(2,"B",3,4,"01/01/01","intel1","teamleader1");

String address= new String("D:"+File.separator+"text1.txt");try{

ObjectOutputStream oout= new ObjectOutputStream (newFileOutputStream(address));

oout.writeObject(manager);

oout.writeObject(manager1);

oout.close();

}catch(IOException e) {

System.out.println(e.getMessage());

}

manager= null;

manager1= null;try{

ObjectInputStream oin= new ObjectInputStream(newFileInputStream(address));

manager=(ManagerExtern)oin.readObject();

manager1=(ManagerExtern)oin.readObject();

oin.close();

System.out.println(manager);

System.out.println(manager1);

}catch(Exception e) {

System.out.println(e.getMessage());

}

}

}classEmployExtern{protected intid;protectedString name;protected intage;protected intsalary;protectedString hireDay;protectedString department;protectedEmployExtern() {

}public EmployExtern(int id,String name,int age,intsalary,String hireDay,String department) {this.id =id;this.name =name;this.age =age;this.salary =salary;this.hireDay =hireDay;this.department =department;

}publicString toString() {return " ID:"+id+"\n Name:"+name+"\n Age:"+age+"\n Salary:"+salary+"\n hireDay"+hireDay+"\n Department"+department;

}

}class ManagerExtern extends EmployExtern implementsExternalizable{privateString position;publicManagerExtern() {

}public ManagerExtern(int id,String name,int age,intsalary,String hireDay,String department,String position) {super(id,name,age,salary,hireDay,department);this.position =position;

}public void writeExternal(ObjectOutput out) throwsjava.io.IOException{

Date savedDate= newDate();

out.writeInt(id);

out.writeInt(age);

out.writeInt(salary);

out.writeUTF(name);

out.writeUTF(hireDay);

out.writeUTF(department);

out.writeUTF(position);

out.writeInt(savedDate.getYear());

}public void readExternal(ObjectInput in) throwsjava.io.IOException, java.lang.ClassNotFoundException{

Date readDate= newDate();intsavedDate;

id=in.readInt();

age=in.readInt();

salary=in.readInt();

name=in.readUTF();

hireDay=in.readUTF();

department=in.readUTF();

position=in.readUTF();

savedDate=in.readInt();

age= age +(readDate.getYear()-savedDate);

}publicString toString() {return super.toString()+"\n Position:"+position;

}

}

f53abb0ed29693ee3bb87a6cabfdb328.png

transient 可以保护信息不被串行化、反串行化。

敏感嘻嘻或重要的类不应该允许串行化。这样的类不能实现Externalizable 接口和Serializable接口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值