java中的序列化流和反序列化流

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 }

序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。    对象 -- 流数据(ObjectOutputStream)

反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)

序列化流和反序列化流不同于字节流 字符流 内存字节流,这些都是把字符串写入/读取文件,序列化流和反序列化流可以将对象写入/读取文本文件中.

但是我们要注意的是,写入和读取的文件要实现Serializable这个接口,当然这个接口是没有任何方法的,直接implements就好,类似于这种没有任何方法的接口被称为标记接口.

可是当我们对原有的对象中的数据改变了之后,直接读取(不写入,在实际开发中不能每改一次就写入一次),就会报错:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 }
span.s1 { text-decoration: underline }

java.io.InvalidClassException: DemoPerson; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344,  local class serialVersionUID = -8345153069362641443

这是因为对象类实现Serializable就会有一个id值,当改变对象中的数据时,这个id值会发生改变,但是文本文件中的写入和读取的id还是以前的id值,造成id值不匹配,就会报错,解决办法:对象类中会报一个黄色的警告,点击这个警告按照编译器实现就行.

附代码:

Person类

 1 public class Person implements Serializable {
 2     private static final long serialVersionUID = -2071565876962058344L;
 3
 4     private String name;
 5
 6     // private int age;
 7
 8     private transient int age;
 9
10     // int age;
11
12     public Person() {
13         super();
14     }
15
16     public Person(String name, int age) {
17         super();
18         this.name = name;
19         this.age = age;
20     }
21
22     public String getName() {
23         return name;
24     }
25
26     public void setName(String name) {
27         this.name = name;
28     }
29
30     public int getAge() {
31         return age;
32     }
33
34     public void setAge(int age) {
35         this.age = age;
36     }
37
38     @Override
39     public String toString() {
40         return "Person [name=" + name + ", age=" + age + "]";
41     }
42 }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun }

ObjectStreamDemo 类

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6
 7 public class ObjectStreamDemo {
 8     public static void main(String[] args) throws IOException, ClassNotFoundException {
 9 //        write();
10
11         read();
12     }
13
14     private static void read() throws IOException, ClassNotFoundException {
15         //反序列化对象
16         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oss.txt"));
17         //接收对象是Object
18         Object ob = ois.readObject();
19
20         ois.close();
21
22         System.out.println(ob);
23     }
24
25     private static void write() throws IOException {
26         //创建序列化输出流
27         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oss.txt"));
28
29         Person p = new Person("熊大", 16);
30
31         oos.writeObject(p);
32
33         oos.close();
34     }
35 }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun }

时间: 2024-11-07 23:51:27

java中的序列化流和反序列化流的相关文章

Java基础知识强化之IO流笔记65:序列化流 和 反序列化流

1. 什么是 序列化 和 反序列化 ?     序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象.一般的格式是与平台无关的二进制流,可以将这种二进制流持久保存在磁盘上,也可以通过网络将这种二进制流传输到另一个网络结点.  反序列化(Anti Serialization ):是指把这种二进制流数据还原成对象. 2. 序列化流 和 反序列化

java ->IO流_序列化流与反序列化流

序列化流与反序列化流 用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流 用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流(对象保存到文件中) l  特点:用于操作对象.可以将对象写入到文件中,也可以从文件中读取对象. 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取

IO流--序列化流与反序列化流

IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): 具体的使用: 1   创建java对象 实现序列化接口(Serializable): 序列化代码实现: 1 private void writer() throws IOException { 2 ObjectOutputStream oos = new ObjectOutputStream(ne

java--Properties、序列化流及反序列化流

一. Properties类 1. Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: (1).Hashtable的子类,map集合中的方法都可以用. (2).该集合没有泛型.键值都是字符串. (3).它是一个可以持久化的属性集.键值可以存储到集合中,也可以存储到持久化的设备(硬盘.U盘.光盘)上.键值的来源也可以是持久化的设备. (4).有和流技术相结合的方法. 2.常用

序列化流与反序列化流

序列化流与反序列化流 用于从流中读取对象的 操作流 ObjectInputStream    称为 反序列化流 用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流 特点:用于操作对象.可以将对象写入到文件中,也可以从文件中读取对象. 1 对象序列化流ObjectOutputStream 注意:只能将支持 java.io.Serializable 接口的对象写入流中 public static void method01() throws IOException{

序列化流与反序列化流,打印流

序列化流与反序列化流 ObjectOutputStream(序列化流) 将 Java 自定义对象写入 OutputStream.可以使用 ObjectInputStream(反序列化流) 读取对象.通过在流中使用文件可以实现对象的持久存储. ObjectOutputStream 序列化流   writeObject() 将指定的对象写入ObjectOutputStream 例: //创建对象 person per=new person("小红帽",18);//自定义类 //目的地 Fi

详解 序列化流 与 反序列化流

目录 序列化流 与 反序列化流 ObjectOutputStream 类: (序列化流) ObjectInputStream 类: (反序列化流): (请观看本人博文--<详解 I/O流>) @ 序列化流 与 反序列化流 可能同学们看到本篇博文时会有如下问题: 什么是 序列化 与 反序列化 呢? 那么,现在,本人就来讲解下这两个名词的定义: 序列化: 就是把对象通过流的方式存储到文件中 反序列化: 就是把文件中存储的对象以流的方式还原成对象 现在,本人再来介绍下这两个流的作用: ObjectI

字符缓冲流,properties类,序列化流与反序列化流,打印流

1.字符缓冲流的写法与字节缓冲流类似,也是用字符缓冲对象嵌套字符读写对象.格式为: BufferedReader br=new BufferedReader(new FileReader(数据源)): BufferedWriter bw=new BufferedWriter(new FileWriter(目的地)): 2.BufferedReader有一个优势是可以读取一个文本行,它的方法是readLine(),这与FileReader相区别. 3.在IO操作时选用哪个对象,要看输入还是输出,文

Java中如何序列化一个对象(转)

转自:http://blog.csdn.net/chx10051413/article/details/40784667 http://www.cnblogs.com/baoendemao/p/3804797.html Java 中如何序列化一个对象 我们都知道java 中无法保存一个对象到文本文件中,但是当我们有这种需求的时候,我们可以通过java 的序列化功能把当前对象的一些属性以二进制的形式保存到文件中.当我们需要这个对象的时,只需要从二进制文件中还原为保存前的对象即可.从这里我们可以得到