序列化分为两个步骤:
1.建立ObjectOutputStream输出流对象,该对象需要建立在一个文件输出流上,如FileOutputStream。
2..利用该对象的writeobject(object obj)方法即可将序列化后的对象写入文件。
//序列化的对象需要实现serializable接口,但是不用实现任何方法
public class MyClass implements java.io.Serializable {
private String myName;
private int myAge;
public MyClass(String name,int age){
this.myName=name;
this.myAge=age;
}
public void showInfo(){
System.out.println(this.myName+"年龄为:"+this.myAge);
}
}
public static void main(String[] args){
//序列化:
//该对象可将序列化后的实例写入磁盘文件
//ObjectOutputStream输出流需要建立在一个文件输出流的基础上
ObjectOutputStream oos=null;
try{
//创建一个输出流
oos=new ObjectOutputStream(new FileOutputStream("serializable.txt"));
oos.writeObject(new MyClass("fly",24));//将MyClass对象写入至输出流
}
catch(IOException ex){
ex.printStackTrace();
}
finally{
if(oos!=null){
try{
oos.close();
}
catch(IOException ex){
ex.printStackTrace();
}
}
}
反序列化与之相反:
1.建立一个ObjectIntputStream输入流对象,该对象需要建立在一个文件输入流上,如FileInputStream。
2..利用该对象的readobject(filename)方法即可将文件文件中的二进制对象读取至内存中,通过强转获取恢复该对象。
//反序列化:
ObjectInputStream ois=null;//输入流
try {
ois=new ObjectInputStream(new FileInputStream("serializable.txt"));
MyClass myClass= (MyClass)ois.readObject();
myClass.showInfo();
}
catch (Exception ex) {
ex.printStackTrace();
}
finally{
if(ois!=null){
try{
ois.close();
}
catch(IOException ex){
ex.printStackTrace();
}
}
}
输出:fly年龄:24
总结:
1.若需要序列化的类中含有引用对象,则该对象必须也实现serializable,即可序列化。
2.java序列化机制不会将同一引用对象重复序列化,若发现该对象已经被序列化了,则下次不会序列化。如
MyClass m=new MyClass();
oos.writeObject(m);
oos.writeObject(m);
并不会序列化两次m对象,在输出的二进制文件中只有一个对象。因此不要在序列化后修改该对象的值,因为即使修改了值然后再次序列化,还是不会输出至文件中(仍然是同一对象)。
3.反序列化时一定要按照序列化时的顺序进行读取。
4.若不希望序列化某个字段则可再该字段前夹transient.