Java Serializable序列化,反序列化 ,serialVersionUID的作用

        Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。通过序列化可以把对象转换成字节流,可以进行网络传输,保持到本地文件,数据库等,增加对象的生命周期。

        序列化针对的对象的数据,也就是字段属性,使用transient关键字可以使字段不被序列化

用法:

          序列化实现非常简单,只需要对象继承serializable接口就行。serializable是一个空接口,没有任何方法(这种接口叫做标记接口,类似的接口还有重写clone方式要用到的cloneable接口)。

         下面例子使用序列化和反序列化,将对象存到文件当中,然后从文件当中读取该对。对象的保存和读取用到java.Io里的ObjectInputStream和ObjectOutputStream字节流。

public class Main {
	public static void main(String arg[]){
		Person p=new Person("xjp",50);
		savePerson(p);
		p=getPerson();
		p.print();
	}
	static void savePerson(Person p){
		FileOutputStream fout;
		try {
			fout = new FileOutputStream("e:\\person.txt");
			ObjectOutputStream objout=new ObjectOutputStream(fout);
			objout.writeObject(p);
			objout.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	static Person getPerson(){
	
		FileInputStream fin;
		try {
			fin = new FileInputStream("e:\\person.txt");
			ObjectInputStream objin=new ObjectInputStream(fin);
			Person p=(Person)objin.readObject();
			objin.close();
			return p;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
		
	}
}
class Person implements Serializable {
	private String name;
	private int age;
	Person(String s,int a){
		name=s;
		age=a;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public void print(){
		System.out.println("name:"+name);
		System.out.println("age:"+age);
	}
	
}
输出:

name:xjp

age:50

serialVersionUID的作用。

   serialVersionUID表示实体类的当前版本,每个实现Serializable接口的类都有,如果没有的设置该值,java序列化机制会帮你默认生成一个。

在eclipse当中可以利用提示生成一个,如:

private static final long serialVersionUID = 1L;

最好在使用serializable接口是,设定serialVersionUID为某个值,不然当在传输的某一端修改实体类时,serialVersionUID会被虚拟机设置成一个新的值。造成两端的serialVersionUID不一致会发生异常,如下:

Exception in thread "main" java.io.InvalidClassException: abs.Person; local class incompatible: stream classdesc serialVersionUID = -8712556269991865625, local class serialVersionUID = -7287841237118807618
	at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at abs.Main.main(Main.java:43)



你可能感兴趣的:(JAVA)