2017-11-05 20:42:06

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

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

  • ObjectOutputStream

ObjectOutputStream:ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream(反序列化) 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

注意:要被序列化的类需要实现Serializable接口,否则就不能进行序列化,但是这个类是个标记接口,就是没有需要重写的方法。

*构造方法

*常用方法

  • ObjectInputStream

ObjectInputStream:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

*构造方法

*常用方法

import java.io.*;

public class Demo5 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//write();
read();
} public static void write()throws IOException{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:/test.txt")); // 类需要有序列化接口才能被序列化
Student st = new Student("张三",20); // 序列化
oos.writeObject(st); oos.close();
} public static void read() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:/test.txt")); //反序列化
Object obj = ois.readObject(); ois.close(); //输出对象
System.out.println(obj); }
} import java.io.Serializable; public class Student implements Serializable{
private String name;
private Integer age; Student(String name,int age)
{
this.name=name;
this.age=age;
} }

问题一、如果在读取之前修改了Student类那么在read()函数的执行过程中会产生一个错误:

Exception in thread "main" java.io.InvalidClassException:
DemoFile.Student; local class incompatible:
stream classdesc serialVersionUID = -8639914051049964771,
local class serialVersionUID = -7579084536321238113

原因是:由于Student类实现了序列化接口,所以会生成一个序列化的标记值,但是如果你修改了Student类,那么这个序列化值就会发生变化。在读取的时候会发现序列化值不匹配的问题,就会报错。

解决方法就是是这个序列号变成常量,这样的化,我们在修改类后,它的数据读取就不会产生上述的问题。

public class Student implements Serializable{

    private static final long serialVersionUID = -7579084536321238113L;

    private String name;
private int age;
// int age; Student(String name,int age)
{
this.name=name;
this.age=age;
} }

问题二:类中的成员变量不被序列化的方法 : 加上 transient 关键字。

Java IO流-序列化流和反序列化流的更多相关文章

  1. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  2. ObjectOutputStream:对象的序列化流 ObjectInputStream:对象的反序列化流

    package com.itheima.demo04.ObjectStream; import java.io.FileOutputStream; import java.io.IOException ...

  3. Java IO(十二) 字符流 Writer 和 Reader

    Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...

  4. java.io.Serializable 序列化问题

    java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...

  5. java.io.Serializable 序列化问题【原】

    java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...

  6. java IO(六):额外功能处理流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. Java IO详解(五)------包装流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  8. java IO(五):字节流、字符流的选择规律

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. 系统学习 Java IO (十二)----数据流和对象流

    目录:系统学习 Java IO---- 目录,概览 DataInputStream/DataOutputStream 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型. 要想使用 ...

  10. Java Io 对象序列化和反序列化

    Java 支持将任何对象进行序列化操作,序列化后的对象文件便可通过流进行网络传输. 1.      对象序列化就是将对象转换成字节序列,反之叫对象的反序列化 2.      序列化流ObjectOut ...

随机推荐

  1. Mssql备份失败

    Mssql备份失败出现如下提示 备份时先删除默认的备份设备,自己选择路径

  2. CodeForeces 25E (kmp)

    E. Test time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputst ...

  3. EF批量添加,删除,修改的扩展

    在EF各版本中,没有相应批量的添加,删除,修改,在用ORM 处理数据时直有个尴尬.在网上,也接到了很多网友的询问这方面的情况,特此今天把这方面的相关扩展分享一下,(这里只做批量删除的例子,添加和修改的 ...

  4. Oracle性能优化之Oracle里的统计信息

    一.什么是统计信息 oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息. oracle数据库里的统计信息主要分为以下6种情况: ...

  5. AttributeError: 'module' object has no attribute 'face'

    报错 raceback (most recent call last): File "D:/work/python/face_ai/predict.py", line 41, in ...

  6. [Python模块学习]用qrcode模块生成二维码

    转自:https://blog.csdn.net/jy692405180/article/details/65937077

  7. html/css实现文字自动换行,超出部分出现(...)

    PS:这是我在别人博客copy下来的 做前端的我们都会发现这样一个问题,当你控制文字出现多行时,而这多行是有限制的(比如超出部分隐藏不显示),而这多行文字如果全部是数字或者字母抑或是数字和字母的组合时 ...

  8. 无题II---hdu2236(二分,匈牙利)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2236 要求最大值与最小值的差值最小,是通过枚举边的下限和上限来完成 只需要用二分找一个区间,然后不断枚 ...

  9. python使用tesseract-ocr完成验证码识别

    全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart) 简称CAP ...

  10. SQL Server 不同网段IP通过名称访问

    1, 设置订阅服务器C:\Windows\System32\drivers\etc目录的host文件,添加分发服务器(我的环境是发布服务器与分发服务器 是一起的,所以这里指定的是发布服务器的地址)信息 ...