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可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...
随机推荐
- QT分页控件,开源,供大家使用
下载地址:http://files.cnblogs.com/dragonsuc/qt5.rar
- js实现点击<li>标签弹出其索引值
据说这是一道笔试题,以下是代码,没什么要文字叙述的,就是点击哪个<li>弹出哪个<li>的索引值即可: <html> <head> <style& ...
- JS-取出字符串中重复次数最多的字符并输出
/** 取出字符串中重复字数最多的字符 */ var words = 'sdfghjkfastgbyhnvdstyaujskgfdfhlaa'; //创建字符串 var word, //单个字符 le ...
- Force.com微信开发系列(一) 后台配置
为寻找国内免费云资源作为微信后台,花了一天时间试用SinaAppEngine(SAE),调试太不方便用户体验差.新浪作为媒体公司技术功底经不起考验,亚马逊能推出AWS,新浪还不行!更好选项是百度Bai ...
- App开发流程之状态栏和导航栏
记录状态栏和导航栏的设置和控制,统一在基类视图控制器中完成. 状态栏. 状态栏高度为20,iOS7以后背景完全透明. 样式枚举如下: typedef NS_ENUM(NSInteger, UIStat ...
- JAVA基础学习day27--反射机制
一.概述 1.1.概述 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态获取信息以及动 ...
- HTML5--Audio
一.Audio标签 Web 上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规 ...
- 朝花夕拾-android 一个注册新用户时,多步填写用户资料的框架
源码地址:http://git.oschina.net/zj2012zy/Android-Demo/tree/master/AndroidDemo/setpregister 效果如下: 基本思路: 1 ...
- 使用 ServiceStack.Text 序列化 json 比Json.net更快
本节将介绍如何使用ServiceStack.Text 来完成高性能序列化和反序列化操作. 在上章构建高性能ASP.NET应用的几点建议 中提到使用高性能类库,有关于JSON序列化的讨论. 在诊断web ...
- java微信接口之二—获取用户组
一.微信获取用户组接口简介 1.请求 该请求也是GET方式请求.请求的url格式如下: https://api.weixin.qq.com/cgi-bin/groups/get?access_toke ...