java 21 - 13 IO流之序列化和反序列化
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)
构造方法:ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)
构造方法:ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
由于序列化和反序列化的操作对象是类,所以先创建个类:
package zl_Copy; import java.io.Serializable; /*
//NotSerializableException:类未序列化异常,所以所要序列话的类要实现Serializable接口 */
public class Animal implements Serializable{ private static final long serialVersionUID = 6425500536266476858L;
private String name;
//private int age;
* private transient int age; public Animal() {
super();
// TODO Auto-generated constructor stub
} public Animal(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 "Animal [name=" + name + ", age=" + age + "]";
} }
实现类:
public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException {
//由于序列化的对象是个类,所以要首先创建一个类
//序列化方法
//write();
//反序列化
read();
} private static void read() throws IOException, IOException, ClassNotFoundException {
// 创建反序列化对象
//ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt")); //还原序列化对象,不管什么类,反正它父类是Object
Object o = ois.readObject(); //释放资源
ois.close();
//输出结果到控制台看看
System.out.println(o);
//Animal [name=萨摩耶, age=2] } private static void write() throws IOException {
//创建序列化对象
//ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.txt")); //创建所要序列化的类的对象
Animal a = new Animal("萨摩耶",2); //写入序列化对象中,注意,写入的是类
oos.writeObject(a); //释放资源
oos.close(); //java.io.NotSerializableException
//NotSerializableException:类未序列化异常,所以所要序列话的类要实现Serializable接口
} }
注意:
private static final long serialVersionUID = 6425500536266476858L;:
为什么要写这个?如果不写这个,若是更改了类里面的变量,如:
private int age;
改为:
int age;
若是这样更改了以后,就必须重新进行序列化,不然就会出现错误:
java.io.InvalidClassException: cn.itcast_07.Person; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344, local class serialVersionUID = -8345153069362641443
为什么会有问题呢?
Person类实现了序列化接口,那么它本身也应该有一个标记值。
先把这个标记值假设是100。
开始的时候:
Person.class -- id=100
wirte数据: oos.txt -- id=100
read数据: oos.txt -- id=100
更改了age以后:
Person.class -- id=200
wirte数据: oos.txt -- id=100
read数据: oos.txt -- id=100
我们在实际开发中,可能还需要使用以前写过的数据,但是不能重新写入。
所以,我们要让这个id值在java文件中设为一个固定的值,这样,修改文件的时候,这个id值就不会发生改变。
方法是:看到类名处有黄色警报线,点击鼠标即可。
private transient int age;
一个类中可能有很多的成员变量,但是有些变量不想进行序列化。
方法:使用transient关键字声明不需要序列化的成员变量
java 21 - 13 IO流之序列化和反序列化的更多相关文章
- java 21 - 13 IO流之 合并流
SequenceInputStream :表示其他输入流的逻辑串联. 构造方法摘要 SequenceInputStream(Enumeration<? extends InputStream&g ...
- IO流的序列化和反序列化
序列化和反序列化的概念: 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 序列化和反序列化的使用: java.io ...
- Java 持久化之 --io流与序列化操作
1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...
- java 21 - 12 IO流的打印流
打印流 字节流打印流 PrintStream 字符打印流 PrintWriter打印流的特点: A:只有写数据的,没有读取数据.只能操作目的地,不能操作数据源.(只能写入数据到文件中,而不能从文件中提 ...
- java 21 - 11 IO流的标准输入流和标准输出流
标准输入输出流 System类中的两个成员变量: public static final InputStream in "标准"输入流. public static final P ...
- java 21 - 1 IO流中的字符流概述
字节流通过读取一个byte数组的方式可以读取中文的,但是有可能出现小问题,所以,读取中文最好是用字符流. 字符流: 字符流=字节流+编码表. 编码表: 由字符及其对应的数值组成的一张表 编码表介绍: ...
- java 21 - 7 IO流小结的图解
- java进阶(33)--IO流
一.IO流概念:1.基本概念2.IO流分类3.java.io流的四大家族4.流的close和flush方法5.java.id下常用的16个流 二.FileInputStream字节输入流1.FileI ...
- 第53节:Java当中的IO流(上)
Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...
随机推荐
- [转]MVC、MVP、MVVM
界面之下:还原真实的 MVC.MVP.MVVM 模式 [日期:2015-10-28] 来源:github.com/livoras 作者:戴嘉华 [字体:大 中 小] 前言 做客户端开发.前端开发 ...
- System.Data.Dbtype转换为System.Data.SqlDbType
最近在做一些OM Mapping的准备工作,新学了一招. 如果要将System.Data.Dbtype转换为System.Data.SqlDbType,以前以为要写Switch Case语句.其实有很 ...
- iOS设计模式之中介者模式
中介者模式 基本理解 中介者模式又叫做调停者模式,其实就是中间人或者调停者的意思. 尽管将一个系统分割成许多对象通常可以增加可复用性,但是对象之间的连接又降低了可复用性. 如果两个类不必彼此直接通信, ...
- iOS 简单工厂模式
iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
- Unity与Android的相互交互
1.Unity调用Android. Unity块代码: using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.play ...
- IOS之UI -- 按钮UIButton的细节
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Objective-C之@类别小实例
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- json数组和List转换
package hb; import java.util.Date; public class Person { String id; int age; String name; Date birth ...
- android 进程/线程管理(二)----关于线程的迷思
一:进程和线程的由来 进程是计算机科技发展的过程的产物. 最早计算机发明出来,是为了解决数学计算而发明的.每解决一个问题,就要打纸带,也就是打点. 后来人们发现可以批量的设置命令,由计算机读取这些命令 ...
- 数据库性能调优——sql语句优化(转载及整理) —— 篇2
下面是在网上搜集的一些个人认为比较正确的调优方案,如有错误望指出,定虚心改正 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中 ...