序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(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流之序列化和反序列化的更多相关文章

  1. java 21 - 13 IO流之 合并流

    SequenceInputStream :表示其他输入流的逻辑串联. 构造方法摘要 SequenceInputStream(Enumeration<? extends InputStream&g ...

  2. IO流的序列化和反序列化

    序列化和反序列化的概念: 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 序列化和反序列化的使用: java.io ...

  3. Java 持久化之 --io流与序列化操作

    1)File类操作文件的属性 1.File类的常用方法 1. 文件的绝对完整路径:getAbsolutePath() 文件名:getName() 文件相对路径:getPath() 文件的上一级目录:g ...

  4. java 21 - 12 IO流的打印流

    打印流 字节流打印流 PrintStream 字符打印流 PrintWriter打印流的特点: A:只有写数据的,没有读取数据.只能操作目的地,不能操作数据源.(只能写入数据到文件中,而不能从文件中提 ...

  5. java 21 - 11 IO流的标准输入流和标准输出流

    标准输入输出流 System类中的两个成员变量: public static final InputStream in "标准"输入流. public static final P ...

  6. java 21 - 1 IO流中的字符流概述

    字节流通过读取一个byte数组的方式可以读取中文的,但是有可能出现小问题,所以,读取中文最好是用字符流. 字符流: 字符流=字节流+编码表. 编码表: 由字符及其对应的数值组成的一张表 编码表介绍: ...

  7. java 21 - 7 IO流小结的图解

  8. java进阶(33)--IO流

    一.IO流概念:1.基本概念2.IO流分类3.java.io流的四大家族4.流的close和flush方法5.java.id下常用的16个流 二.FileInputStream字节输入流1.FileI ...

  9. 第53节:Java当中的IO流(上)

    Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...

随机推荐

  1. Android图像处理之Bitmap类

      Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现 ...

  2. Threading.Tasks 简单的使用

    using Lemon.Common; using System; using System.Collections.Generic; using System.Linq; using System. ...

  3. vc6.0连接mysql数据库

    一.MySQL的安装 Mysql的安装去官网下载就可以...最新的是5.7版本.. 二.VC6.0的设置 (1)打开VC6.中选0 工具栏Tools菜单下的Options选项,在Directories ...

  4. IOS杂笔- 7(类方法load与initialize的区别 浅析)

    在介绍两种类方法之前,NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each ...

  5. 关于IOS多线程的好的技术博客

    点击图片就能跳转链接到目标网页. 1.GCD<本人已阅,写的非常好>

  6. Linux套接字编程

    网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...

  7. Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification. The type parameter list, ...

  8. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

    数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFI ...

  9. 安装node.js+express for win7的Web开发环境配置

    1.安装 node.js. 进入官网的下载地址:http://www.nodejs.org/download/ . 选择Windows Installer或者选择Windows Installer ( ...

  10. PHP递归创建多级目录(一道面试题的解题过程)

    今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...