`
yidongkaifa
  • 浏览: 4059213 次
文章分类
社区版块
存档分类
最新评论

Java I/O流操作(四)---对象的序列化

 
阅读更多
首先,把对象序列化必须实现Serializable接口, 只有这样才能把对象持久化到硬盘获取其他地方.
对象序列化操作需要使用到ObjectOutputStream和ObjectInputStream两个对象
ObjectOutputStream(OutputStreamout)
创建一个ObjectOutputStream 把对象往OutputStream输出流写入
ObjectOutputStream也是字节输出流的子类:
java.lang.Object
  java.io.OutputStream
      java.io.ObjectOutputStream
ObjectInputStream是字节输入流的子类:
java.lang.Object
  java.io.InputStream
      java.io.ObjectInputStream
ObjectOutputStream通过writeObject(Objectobj) 
ObjectInputStream通过readObject() 
通过一个简单的程序测试:

publicstaticvoidobjetcSeri()throwsException {

ObjectOutputStream oos =newObjectOutputStream(
newFileOutputStream("person.object"));
//写入person对象
oos.writeObject(newPerson("johnny",21,"CHINA"));
oos.close();

}

控制台 出现如下错误:
Exception in thread "main" java.io.NotSerializableException: com.huaxia.day21.Person
at 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学习笔记 初学者必读

    15.3. 对象的序列化接口 15-47 15.4. I/O流基础 15-47 15.5. 流的分类 15-47 15.6. I/O输入输出 15-48 16. 十五•网络编程 16-52 16.1. 网络基础知识 16-52 16.2. TCP Socket 16-54 16.2.1. 建立TCP服务器端 16-54 ...

    JAVA_API1.6文档(中文)

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的...

    java维基源码-java-extra-lectures:有关Java额外讲座的源代码-不在Wiki书的一章中

    使用序列化缓存对象 类加载和实例初始化 数据结构-集合和地图 Java枚举- Java 8流和Lambdas- Jar文件- Java I / O(java.io类)- Java可选- Systembolaget产品的JDBC和Servlet示例- Java网络- Java Swing-GUI编程- ...

    corejavaNoteBook

    15.3. 对象的序列化接口 15-47 15.4. I/O流基础 15-47 15.5. 流的分类 15-47 15.6. I/O输入输出 15-48 16. 十五•网络编程 16-52 16.1. 网络基础知识 16-52 16.2. TCP Socket 16-54 16.2.1. 建立TCP服务器端 16-54 ...

    java jdk-api-1.6 中文 chmd

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的...

    Java 1.6 API 中文 New

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口...

    java api最新7.0

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口...

    JavaAPI1.6中文chm文档 part1

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的...

    java深度历险

    java字节码 java类加载 java线程 java垃圾回收 java泛型 java注解 java反射与动态代理 javaI/O java安全 java对象序列化

    java-io-guide:Java中的Java IO(输入和输出流)指南

    文件序列化示例 如何用Java将对象写入文件 如何从文件读取对象 文件压缩示例 用Java压缩ZIP格式的文件 从Java中的ZIP文件解压缩文件 目录 目录操作示例列表。 获取当前工作目录 建立目录 删除目录 复制目录 遍历...

    重要的Java概念::rocket:完整的Java-从A到Z║:books:Java的所有基本概念和重要概念的注释和程序-OOPS,数据结构,算法,设计模式和开发

    学习Java编程 此仓库包含与以下概念有关的Java程序: Java基础知识 Java面向对象编程 Java Collections框架 ...[3] Java-文件,I / O,序列化和联网[完成] 注意事项[有用的信息]: 程式 : 数据解析(CS

    JavaAPI中文chm文档 part2

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的...

    java深度历险 InfoQ中文站

    InfoQ中文站 1、java字节码操作 2、java类的加载、链接和初始化 3、java线程 4、java垃圾回收机制与引用类型 5、java泛型 6、java注解 7、java反射与动态代理 8、javaI/O 9、java安全 10、java对象序列化与RMI

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    9.1.4 对象XML序列化 227 9.2 练习 228 9.2.1 我的联系手册(JPA实现) 228 9.2.2 我的联系手册(JAXB实现) 238 9.3 小结 242 第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 ...

    软件工程师Java班课程

    J2SE平台Java程序设计 Java AWT图形界面程序开发,Swing图形程序设计, Socket网络应用程序设计,对象序列化,Java 常用数据结构,Applet,高级I/O流和文件编程,多线程程序设计 熟练掌握J2SE平台的Java程序设计技能 ...

    [Java参考文档]

    javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的...

    corejava培训文档

    15.3. 对象的序列化接口 15.4. I/O流基础 15.5. 流的分类 15.6. I/O输入输出 16. 十五 网络编程 16.1. 网络基础知识 16.2. TCP Socket 16.2.1. 建立TCP服务器端 16.2.2. 建立TCP客户端 16.3. 建立URL...

Global site tag (gtag.js) - Google Analytics