1、实现Serializable接口,全部序列化
2、实现Serializable接口,使用transient可以避免当前被关键字修饰的成员变量失去序列化
3、实现Externalizable接口,在方法中选择需要序列化的成员变量,切记需要一个空的构造函数,不管成员变量是否被关键字transient修饰,只要在方法中确认都可以。
4、Hibernate中的@Transient使用
eg:
package info.kagoy.calculator;
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
MyClass object1 = null;
try {
object1 = new MyClass("Hello", -7, 2.7e10);
// 写入数据
System.out.println("object1:" + object1);
FileOutputStream fos = new FileOutputStream("serial");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(object1);
oos.flush();
oos.close();
} catch (Exception e) {
System.out.println("Exception during serialization:" + e);
System.exit(0);
}
// Object deserialization
try {
MyClass object2;
FileInputStream fis = new FileInputStream("serial");
ObjectInputStream ois = new ObjectInputStream(fis);
object2 = (MyClass) ois.readObject();
ois.close();
System.out.println("object1=object2" + (object1 == object2));
System.out.println("object2:" + object2);
} catch (Exception e) {
System.out.println("Exception during deserialization:" + e);
System.exit(0);
}
}
}
class MyClass implements Serializable {
private String s;
private transient int i;
private transient double d;
public MyClass() {
}
public MyClass(String s, int i, double d) {
this.s = s;
this.i = i;
this.d = d;
}
public String toString() {
return "s=" + s + ";i=" + i + ";d=" + d;
}
}
打印的结果为:
object1:s=Hello;i=-7;d=2.7E10
object1=object2false
object2:s=Hello;i=0;d=0.0