对象的序列化

对象的序列化
序列化就是保存对象中的状态(即类中的属性),就是将对象的实例变量和引用变量存储成为磁盘中的一个文件,以便以后重新使用该对象的时候不用再重新创建。而解序列化就是恢复对象的状态,读取磁盘中的序列化文件,将每项状态赋值给对象,并被新的引用变量引用。

在对象被序列化时,该对象所引用的实例变量都会被序列化。

当然我们也能把一个类序列化,方法就是将该类实现Serialization接口,这个接口没有需要实现的方法,只是用来告诉虚拟机实现这个接口的类都可以被序列化。

如果在被序列化的类中有未实现序列化的类的实例对象,有点拗口;换个说法,就是在类Dog中有类Student的实例变量,类Dog实现了Serialization接口,而Student类没有实现,这时候如果将类Dog序列化,执行期会抛出异常。这时我们就需要transient(瞬时)来标记住不需要和不应该序列化的变量,使用transient需要先import java.net.*。在还原的时候被transient的引用变量值会变为null,primitive主数据类型变量会被还原成默认值。

静态变量是不可被序列化的,因为静态变量是在类上面的变量。

记得用JDK里面的serialver工具来查询类的seriaVersionUID(版本ID)。

再还原对象时会比对该对象的类的版本ID如果不对就会还原失败,一般这个值都被标记为final static 存在类中。

序列化的流程如下:
⑴先创建出FileOutputString对象,该对象用来存取生成的文件。

FileOutputStream  fs=new FileOutputStream(“test.ser”);
test.ser就是生成的文件名,在字符串中你可以定义要输出的文件的路径。

例如D:\\javaserialization\\test.ser
好像必须要双反斜杠,不然会报错。

⑵创建ObjectOutputStream对象,将你所需要序列化的对象写入FileOutputString对象fs。

ObjectOutputStream  oos=new ObjectOutputStream  (fs);
传入fs。
⑶将对象的引用变量名写入ObjectOutputStream对象的writerObject方法中。
oos.writerObjec(test);
test就是被序列化的对象的引用变量名。
即Object test=new Object();
⑷最后不要忘了关闭ObjectOutputStream。
oos.close();

以上就是对象的序列化

下面来说对象的解序列化
当我们需要用到被序列化的对象时,我们就要将该对象解序列化,好像是废话。
对象的解序列化也是四步:
⑴连接对象序列化文件
FileInputStrieam  fip=new FileInputStrieam(“test.ser”);
注意如果不在当前目录下要加上文件的路径,如果虚拟机找不到这个文件就会抛出异常。

⑵创建ObjectInputStream对象来读取序列化文件
ObjectInputStream  ois=new ObjectInputStream  (fip);

⑶通过readObject方法返回一个Object类型的对象。还需要将Object对象的类型转换回原来的类型。
Object new=ois.readObject();
注意在序列化文件中可能会存有不止一个的对象的序列化文本,他会按照文本的顺序来读取文本数据。
每次调用readObject方法都会读出下一个对象。

⑷最后关闭ObjectInputStream
ois.close();
package com.xuliehuaTest;
//需要先引用Java中的io包,才能实现Serializable接口。
import java.io.*;
import java.util.ArrayList;

import javax.print.attribute.standard.Sides;
//先建立一个可供序列化的类DogTest。
//然后在main方法中队类DogTest的对象进行序列化。
public class DogTest implements Serializable{
	private int size;
	private String name;
	
	public void setSize(int size){
	this.size=size;
	}
	public void setName(String na){
		name=na;
	}
	public int getSize(){
		return size;
	}
	public String getName(){
		return name;
	}
	public static void main(String[]args){
		DogTest dt=new DogTest();
		DogTest dt1=new DogTest();
		DogTest dt2=new DogTest();
		ArrayList<DogTest> arraylist=new ArrayList<DogTest>();
		arraylist.add(dt);
		arraylist.add(dt1);
		arraylist.add(dt2);
		dt.setSize(12);
		dt.setName("xiao bao");
		dt1.setSize(25);
		dt1.setName("tu qiang");
		dt2.setSize(31);
		dt2.setName("da gei gou");
		try{
			int x=0;
			FileOutputStream f=new FileOutputStream("C:\\daxue.ser");
			ObjectOutputStream oo=new ObjectOutputStream(f);
			while(x<3){
                          //将对象被序列化前的状态打印
			    System.out.println(x);
			    System.out.println("Size="+arraylist.get(x).getSize()+" ");
			    System.out.println("name="+arraylist.get(x).getName());
			    System.out.println(arraylist.get(x));

			    oo.writeObject(arraylist.get(x));
			    x=x+1;
			    
			}
			oo.close();
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

package com.xuliehuaTest;
import java.io.*;
import java.util.ArrayList;
public class JieXuLieHua {
	static ArrayList<Object> arraylist=new ArrayList<Object>();
	public static void main(String[] args){
		try{
			
			FileInputStream fdi=new FileInputStream("C:\\liheng.ser");
			ObjectInputStream oi=new ObjectInputStream(fdi);
			Object o1=oi.readObject();
			Object o2=oi.readObject();
			Object o3=oi.readObject();
			arraylist.add(o1);	
			arraylist.add(o2);
			arraylist.add(o3);	
			int x=0;
			while(x<3){
                               //将解序列化的对象状态进行打印
				System.out.println(x);
				System.out.println((DogTest)arraylist.get(x));
				System.out.println("name = "+((DogTest)arraylist.get(x)).getName());
				System.out.println("size = "+((DogTest)arraylist.get(x)).getSize());
				x=x+1;
			}
			
			oi.close();
		
			
			
			
			}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

[img]

[/img][/size]]

猜你喜欢

转载自201610222643.iteye.com/blog/2339879