Java基础知识强化之IO流笔记65:序列化流 和 反序列化流
2015-10-14 10:30
513 查看
1. 什么是 序列化 和 反序列化 ?
序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。一般的格式是与平台无关的二进制流,可以将这种二进制流持久保存在磁盘上,也可以通过网络将这种二进制流传输到另一个网络结点。
反序列化(Anti Serialization ):是指把这种二进制流数据还原成对象。
2. 序列化流 和 反序列化流:
[b]序列化流:ObjectOutputStream[/b]
[b]反序列化流:ObjectInputStream[/b]
[b]3. 案例代码演示:[/b]
[b][b](1)序列化和反序列化是针对对象进行操作.[/b][/b]
[b][b]所以我们在使用[b][b]序列化流(ObjectOutputStream)和 [b][b]反序列化流(ObjectInputStream)之前,我们先创建一个类:Person,如下:[/b][/b][/b][/b][/b][/b]
测试类,如下:
序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。一般的格式是与平台无关的二进制流,可以将这种二进制流持久保存在磁盘上,也可以通过网络将这种二进制流传输到另一个网络结点。
反序列化(Anti Serialization ):是指把这种二进制流数据还原成对象。
2. 序列化流 和 反序列化流:
[b]序列化流:ObjectOutputStream[/b]
[b]反序列化流:ObjectInputStream[/b]
[b]3. 案例代码演示:[/b]
[b][b](1)序列化和反序列化是针对对象进行操作.[/b][/b]
[b][b]所以我们在使用[b][b]序列化流(ObjectOutputStream)和 [b][b]反序列化流(ObjectInputStream)之前,我们先创建一个类:Person,如下:[/b][/b][/b][/b][/b][/b]
package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化异常 * * 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。 * 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。 * *我们修改Person类中的private int age ---> int age,报如下错误: *java.io.InvalidClassException: * cn.itcast_07.Person; local class incompatible: * stream classdesc serialVersionUID = -2071565876962058344, * local class serialVersionUID = -8345153069362641443 * * 为什么会有问题呢? * Person类实现了序列化接口,那么它本身也应该有一个标记值。这个标记值表明该Person类实现了序列化接口 * 这个标记值假设是100。 * 开始的时候:(没有问题) * Person.class -- id=100 * write数据: oos.txt -- id=100 * read数据: oos.txt -- id=100 * * 现在:() * Person.class -- id=200(修改Person.java,对应的Person.class文件也就改变了,则会产生新的id) * wirte数据:oos.txt -- id=100 * read数据: oos.txt -- id=100 * 我们在实际开发中,可能还需要使用以前写过的数据,不能重新写入。怎么办呢? * 回想一下原因是因为它们的id值不匹配。 * 每次修改java文件的内容的时候,class文件的id值都会发生改变。 * 而读取文件的时候,会和class文件中的id值进行匹配。所以,就会出问题。 * 但是呢,如果我有办法,让这个id值在java文件中是一个固定的值,这样,你修改文件的时候,这个id值还会发生改变吗? * 不会。现在的关键是我如何能够知道这个id值如何表示的呢? * 不用担心,你不用记住,也没关系,点击鼠标即可。 * 你难道没有看到黄色警告线吗? * * 我们要知道的是: * 看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。 * 而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。 * * 注意: * 我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢? * 使用transient关键字声明不需要序列化的成员变量,使用默认值 */ public class Person implements Serializable { private static final long serialVersionUID = -2071565876962058344L; private String name; // private int age; private transient int age; // int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
测试类,如下:
package cn.itcast_07; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /* * 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream) * 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream) */ public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { // 由于我们要对对象进行序列化,所以我们先自定义一个类Person // 序列化数据其实就是把对象写到文本文件 // write(); read(); } private static void read() throws IOException, ClassNotFoundException { // 创建反序列化对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "oos.txt")); // 还原对象 Object obj = ois.readObject(); // 释放资源 ois.close(); // 输出对象 System.out.println(obj); } private static void write() throws IOException { // 创建序列化流对象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( "oos.txt")); // 创建对象 Person p = new Person("林青霞", 27); // public final void writeObject(Object obj) oos.writeObject(p); // 释放资源 oos.close(); } }
相关文章推荐
- rehl6.3下配置JDK1.7
- git辅助eclipse插件的几个常用命令
- Java__中的泛型方法
- 如何去掉Eclipse恼人的悬浮框提示
- Spring3.0.6定时任务
- java读取word表格方法
- Spring3.0.6定时任务task:scheduled
- 使用java实现各种数据统计图(柱形图,饼图,折线图)
- 关于win64下eclipe切换jdk导致启动报错问题
- Spring MVC简单架构
- java springmvc查询列表
- 枚举Java 语言中 Enum 类型的使用介绍
- Spring--quartz中cronExpression配置说明
- 在Spring、Hibernate中使用Ehcache缓存
- Java Log Viewer日志查看器
- Ehcache 整合Spring 使用页面、对象缓存
- java中的printf的用法
- spring配置datasource三种方式
- 线程---JDK查看线程
- JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头