java 序列化 Serializable 与 反序列化 总结
2014-08-29 15:53
615 查看
一 、 默认的序列化
一个对象 要能被 序列化,那么他的 类 必须 实现 implements Serializable 接口。
默认 序列化,只 会 序列化 对象 的 成员变量 (transient 修饰符的 除外)。
即 static的变量、所有的方法 都不会 被 序列化。
如果 类 没有 主动地 写 private static final long serialVersionUID = 100000L; 则 默认序列化 会自动生成 一个UID 。
参见代码:
最终得到的 序列化 后 的文件 如下截图所示:
![](https://img-blog.csdn.net/20140829152836855?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFuZGFveWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可见 只序列化了 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#
一个对象 要能被 序列化,那么他的 类 必须 实现 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序列化反序列化、Serializable、Parcelable 知识总结
- Java Serializable(序列化)的理解和总结
- java序列化(Serializable)的作用和反序列化(转)
- JAVA语言序列化和反序列化(1)-理解和总结
- java 序列化 反序列化(Serializable)详解
- java序列化(Serializable)的作用和反序列化
- 深入理解Java的序列化和反序列化机制——Serializable
- JAVA语言序列化和反序列化(2)-理解和总结
- Java Serializable(序列化)的理解和总结
- Java 对象的序列化 (Serializable)和反序列化
- 我对Java Serializable(序列化)的理解和总结(zz)
- JAVA序列化基础知识Serializable与Externalizable的区别(改变默认的序列化/反序列化行为)
- Java 对象的序列化 (Serializable)和反序列化
- 我对Java Serializable(序列化)的总结
- java序列化(Serializable)的作用和反序列化
- 我对Java Serializable(序列化)的理解和总结
- java序列化(Serializable)的作用和反序列化(转)
- Java 序列化和反序列化总结
- Java 可序列化接口Serializable总结
- java序列化(Serializable)的作用和反序列化