一 、 默认的序列化
一个对象 要能被 序列化,那么他的 类 必须 实现 implements Serializable 接口。
默认 序列化,只 会 序列化 对象 的 成员变量 (transient 修饰符的 除外)。
即 static的变量、所有的方法 都不会 被 序列化。
如果 类 没有 主动地 写 private static final long serialVersionUID = 100000L; 则 默认序列化 会自动生成 一个UID 。
参见代码:
import java.io.Serializable;
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 100000L;
private String name;
private transient String password;
private static int count=0;
public Student(String name,String password)
{
System.out.println("调用Student的带参的构造方法");
this.name=name;
this.password=password;
count++;
}
public String toString()
{
return "人数: "+count+" 姓名: "+name+" 密码: "+password;
}
}
package po;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectSerializableTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
FileOutputStream fos=new FileOutputStream("testabc.obj");
ObjectOutputStream oos=new ObjectOutputStream(fos);
Student s1=new Student("张三","12345");
Student s2=new Student("王五","54321");
System.out.println(s1);
System.out.println(s2);
oos.writeObject(s1);
oos.writeObject(s2);
oos.close();
new Student("xyq","ichedan");
FileInputStream fis=new FileInputStream("testabc.obj");
ObjectInputStream ois=new ObjectInputStream(fis);
Student s3=(Student)ois.readObject();
Student s4=(Student)ois.readObject();
System.out.println(s3);
System.out.println(s4);
ois.close();
}
catch(IOException e)
{
e.printStackTrace();
}
catch(ClassNotFoundException e1)
{
e1.printStackTrace();
}
}
}
最终得到的 序列化 后 的文件 如下截图所示:
可见 只序列化了 name属性。
从中可以得出如下结论: 序列化 实际上 保存了以下内容:
1)对象的类型
2)
serialVersionUID 的值
3)对象 属性的类型 ( 非 static属性)
4)对象 属性的值 (非 static 属性)
上面程序的 输出结果如下所示:
调用Student的带参的构造方法
调用Student的带参的构造方法
人数: 2 姓名: 张三 密码: 12345
人数: 2 姓名: 王五 密码: 54321
调用Student的带参的构造方法
人数: 3 姓名: 张三 密码: null
人数: 3 姓名: 王五 密码: null
二、也可以 自定义 实现 序列化方法。
这样就可以 精确地 控制 序列化 哪些变量。
参考资料:http://blog.csdn.net/wangzhiqing3/article/details/8392820 java 序列化与 反序列化总结
http://blog.csdn.net/wangzhiqing3/article/details/8392814 控制对象的 序列化与 反序列化
http://www.iteye.com/topic/14707#