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

被折叠的 条评论
为什么被折叠?



