java序列化

java序列化
1.一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态。
2.被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写
3.序列化并不保存静态变量。
4.虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(例如:rmi)
5.父类序列化:要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就 需要有默认的无参的构造函数。否则的话,父类变量值都是默认声明的值,如 int 型的默认是 0,string 型的默认是 null。
6.Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
7.Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用
8.对敏感字段加密:在序列化过程中,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法;用户自定义的 writeObject 和 readObject 方法可以允许用户控制序列化的过程和反序列化
public class Person  implements Serializable{
public static String str="1234";
private static final long serialVersionUID = 1L;
private String name;
private String address;
private int age;
private String sex;
private void writeObject(ObjectOutputStream out){
	try {
		PutField pf=out.putFields();
		System.out.println(age);
		int i=100;
		pf.put("age", age+i);
		pf.put("name", name);
		pf.put("address", address);
		System.out.println(age+i);
		out.writeFields();
	} catch (IOException e) {
		e.printStackTrace();
	}
}
private void readObject(ObjectInputStream in){
	try {
		GetField  pf=in.readFields();
		int a=(Integer)pf.get("age", 0)-100;
		String na=(String)pf.get("name","");
		String add=(String)pf.get("address","");
		System.out.println(a);
		age=a;
		name=na;
		address=add;
	} catch (IOException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getAddress() {
	return address;
}
public void setAddress(String address) {
	this.address = address;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
@Override
public String toString() {
	System.out.println(name+","+age+","+address);
	return  getName()+","+getAge()+","+getAddress();
}
public String getSex() {
	return sex;
}
public void setSex(String sex) {
	this.sex = sex;
}
public void print(){
	System.out.println("--------------------|"+str+"|--");
}
}

public static void main(String[] args) {
		File f = new File("per.ser");
		try {
			if (!f.exists())
				f.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Person per = new Person();
		per.setAddress("adddddd");
		per.setAge(12);
		per.setName("tom");

		writeObject(per, f);

		Person fy = readObject(f);
		if (fy != null) {
			fy.toString();
			System.out.println("--fy.getAddress()--" + fy.getAddress());
			fy.print();
		}

	}

	public static void writeObject(Person ff, File f) {
		try {

			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
			oos.writeObject(ff);
			oos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static Person readObject(File f) {
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(new FileInputStream(f));
			return (Person) ois.readObject();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}


引用: http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html

你可能感兴趣的:(java序列化)