您的位置:首页 > 编程语言 > Java开发

java 序列化 Serializable 与 反序列化 总结

2014-08-29 15:53 615 查看
一 、 默认的序列化

一个对象 要能被 序列化,那么他的 类 必须 实现 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#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java