Java对象序列化

本文详细介绍了Java中对象序列化的概念及其应用场景,包括使用Serializable接口和Externalizable接口的方法,探讨了transient关键字的作用,以及如何利用XML提高序列化的互操作性。
对象序列化

1、Java的对象序列化实现了Serializable接口的对象转换成一个字节序列,并且可以以后将这个字节完全恢复为原来的对象;
这样的步骤可以通过网络进行,也就是说,对象序列化机制可以自动弥补不同操作系统之间的差异;

使用对象序列化传递的过程:将对象构造时的必要字段写转化为字节序列,写入文件,读取字节序列后,将其转化为必要字段,调用class的构造方法使用这些必要字段构建新对象;

2、使用Serializable接口自动实现对象的序列化
class Person implements Serializable{
     int id;
     String name;
     transient String password; 
//transient瞬关键字,关键字逐个字段关闭序列化,即不保存和恢复该数据,用于防止对象的敏感部分被序列化;
     public Person(int id,String name,String password){
          this.id = id;
          this.name = name;
          this.password = password;
     }
}
import java.io.*;
main() throws ClassNotFoundException,IOException{
     Person person = new Person(1234,"assad","password");
     //通过序列化写入对象
     ObjectOutputStream out = new ObjetcOutputStream("person.dat");
     out.writeObject(person);
     out.close();
     //通过序列化读取对象
     ObjectInputStream in = new ObjectInputStream("person.dat");
     Person person = (Person)(in.readObject());
     in.close();
}
/*in:
Person
id = 1234
name = assad
password = null*/



3、使用Enternalizable替代Serializable对对象序列化进行控制
Enternalizable继承了Serializable对象,并且添加了2个方法writeEnternal()和readEnternal()方法,这2个方法会在对象序列化反序列化过程中被自动调用
class Person implements Enternalizable{
     int id;
     String password;
     public Person(int id,String password){
          this.id = id;
          this.password = password;
     }
     public void writeObject(ObjectOutput out) throws IOException{
          out.writeInt(id);
          out.wrireObject(password);
     }
     public void readObject(ObjectInput in) throws IOException,ClassNotFoundException{
          id = in.readInt();
          password = (String)in.readObject();
     }
}
main() throws ClassNotFoundException,IOException{
     Person person = new Person(1234,"assad","password");
     //通过序列化写入对象
     ObjectOutputStream out = new ObjetcOutputStream("person.dat");
     out.writeObject(person);
     out.close();
     //通过序列化读取对象
     ObjectInputStream in = new ObjectInputStream("person.dat");
     Person person = (Person)(in.readObject());
     in.close();
}



4、Enternalizable的替代方法
可以通过实现Serializable接口,并且添加wirteObject()和readObject()方法;


5、XML
对象序列化的一个重要的限制是它只是Java的解决方案:只有Java程序可以反序列这种对象,一种更加具有互操作性的解决方案是使用XML,它可以被各种平台和语言使用;
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;

static main() throws IOException,ClassNotFoundException'{
     Person per1 = new Person(20131,"assad");
     Person per2 = new Person(20132,"alter");

     //将对象转化为XML流,并写入文件
     ObjectOutputStream out = new ObjectOutoutStream("person.xml");
     XMLEncoder encoder = new XMlEncode(out);
     encoder.writeObject(per1);
     encoder.writeObject(per2);
     encoder.close();

     //从.xml文件读取对象,使用线性表记录这些对象
     List<Person> list = newArrayList<Person>();
     ObjectInputStream in = new ObjectInputStream("person.xml");
     XMlDecoder decoder = new XMLDecoder(in);
     Object obj;
     while((obj = decoder.readObject())!= null)
          list.add((Person)obj);
     in.close(); 
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值