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