Java I/O流操作(四)---对象的序列化
来源:互联网 发布:淘宝详情页怎么加视频 编辑:程序博客网 时间:2024/05/16 09:31
首先,把对象序列化必须实现Serializable接口, 只有这样才能把对象持久化到硬盘获取其他地方.
对象序列化操作需要使用到ObjectOutputStream和ObjectInputStream两个对象
ObjectOutputStream(OutputStream out)
创建一个ObjectOutputStream 把对象往OutputStream输出流写入
创建一个ObjectOutputStream 把对象往OutputStream输出流写入
ObjectOutputStream也是字节输出流的子类:
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream
ObjectInputStream是字节输入流的子类:
java.lang.Object java.io.InputStream java.io.ObjectInputStream
ObjectOutputStream通过writeObject(Object obj) ObjectInputStream通过readObject() 通过一个简单的程序测试:
publicstaticvoid objetcSeri()throws Exception {
ObjectOutputStream oos =new ObjectOutputStream(
new FileOutputStream("person.object"));
//写入person对象
oos.writeObject(new Person("johnny",21,"CHINA"));
oos.close();
}
控制台 出现如下错误:
Exception in thread "main" java.io.NotSerializableException: com.huaxia.day21.Personat java.io.ObjectOutputStream.writeObject0(Unknown Source)at java.io.ObjectOutputStream.writeObject(Unknown Source)at com.huaxia.day21.ObjectSerializable.objetcSeri(ObjectSerializable.java:15)at com.huaxia.day21.ObjectSerializable.main(ObjectSerializable.java:9)
说明Person这个类没有实现Serializable接口
更正错误后发现硬盘中多了一个person.obejct文件
其内容为一些我们看不懂的字符:
那么我们是否通过ObjectInputStream读取到文件的内容呢?
public static void readObject() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
Person person = (Person)ois.readObject();
System.out.println(person);
}
控制台输出结果:name:johnny age:21 country:CHINA
我们来看一下Serializable接口的API
这意思是说:如果实现了序列化接口的类没有显示声明serialVersionUID变量,序列化运行时将计算一个默认的serialVersionUID的值为这个类基于类的变量方面的值
.我们强烈建议所有实现序列化接口的类都要显示的声明serialVersionUID变量,因为默认的serialVersionUID变量值对于类的修改是非常敏感的,因为他的值就是根据
类成员的签名而生成的而不是系统随机生成的,假设我们对类A进行序列化,在一般情况下我们可以反序列化得到类A的信息,如果我们一旦修改了类A,
那么我们再次反序列化就会出现java.io.InvalidClassException 异常的,因为第一次编译类A的时候他的id是一个值,
你修改类A后在再次编译id的值已经变了.因此为了保证在不同的编译器serialVersionUID变量的值一致性,
所以建议把该变量定义成一个private的常量.
下面来模拟这种情况:现在我修改Person类:如下
重新反序列化一次:
public static void readObject() throws Exception {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));Person person = (Person)ois.readObject();System.out.println(person);}
控制台打印店异常:Exception in thread "main" java.io.InvalidClassException: com.huaxia.day21.Person; local class incompatible:
stream classdesc serialVersionUID = -379036032685453711,
local class serialVersionUID = 1208026685571330753
总结: 对象持久化需要实现Serializable接口, 并且声明serialVersionUID常量
转载请注明出处: http://blog.csdn.net/johnny901114/article/details/8710341
- Java I/O流操作(四)---对象的序列化
- java I/O:对象的序列化
- java 基础之 I/O流 其四 (对象流和序列化)
- Java I/O中的对象序列化
- Java I/O中的对象序列化
- Java I/O中的对象序列化
- Java I/O中的对象序列化
- Java I/O中的对象序列化
- [疯狂Java]I/O:I/O流的最高境界——对象流(序列化:手动序列化、自动序列化、引用序列化、版本)
- JAVA的I/O操作(四)
- Java I/O流与序列化
- java I/O (二)——对象序列化
- java I/O系统(9)-对象序列化与还原
- 深入理解JAVA I/O系列五:对象序列化
- Thinking in java 琐碎知识点之 I/O流 、对象序列化
- Java I/O全文摘要(十三)过滤流,对象序列化
- java的I/O操作
- Java的I/O操作
- 输入3个子串, 输出这3个子串的最大公共子串
- java反射机制(Reflection)(一)-- 概念及APIs介绍
- Talairach空间、MNI空间、Native空间、Stereotaxic空间
- 黑马程序员:IO流
- cmd命令
- Java I/O流操作(四)---对象的序列化
- const详解
- /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
- 裸机S3C6410显示控制器(4)- 显示图像到屏幕
- 第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口
- ServerSocket和Socket通讯实例
- Web开发人员的6种赚钱之道
- Hibernate 自动创建表的方法
- UVA 10973 - Triangle Counting