对象的输出流:ObjectOutputStream  把对象输出到文件存储起来,我们称作为序列化
对象的输入流:ObjectInputStream   把对象从文件中读取出来,我们称作为反序列化

ObjectOutputStream
    构造方法:
        ObjectOutputStream()
            为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
        ObjectOutputStream(OutputStream out)
            创建写入指定 OutputStream 的 ObjectOutputStream。
    一些方法:
        writeObject(Object obj)   将指定的对象写入 ObjectOutputStream。
    注意:其他的一些方法可以查看jdk文档

ObjectInputStream
    构造方法:
        ObjectInputStream()
            为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。
        ObjectInputStream(InputStream in)
            创建从指定 InputStream 读取的 ObjectInputStream。
    一些方法:
        readObject()    从 ObjectInputStream 读取对象。
            注意:readObject方法一次只会读取一个对象,如果想要读取多个对象需要利用EOFException
            EOFException  此异常主要被数据输入流用来表明到达流的末尾。
            其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。

        注意:其他的一些方法可以查看jdk文档
        
对象的输入输出流作用:对象的输入输出流主要的作用是用于读写对象的信息。对象一但写到文件上那么就可以做到持久化了

对象的输入输出流的使用步骤:
    1.被序列化对象的所属类必须实现Serializable(标识)接口
    2.给被序列化对象的所属类指定SerialVersionUID值(可选)
    3.被序列化对象的所属类的某些隐秘成员要使用transient修饰(可选)

对象输入输出流要注意的细节:
    1.如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。Serializable只是一个没有任何方法的接口,一般这样的接口我们称作为标识接口
    2.对象的反序列化创建对象的时候并不会调用构造方法
    3.SerialVersionUID适用于记录被写入对象所属类的版本信息的    ,ServialVersionUID这个数字是通过一个类名、成员、包名、工程名算出来的一个数字
    4.如果反序列化的时候,ServialVersionUID不一致,那么会反序列化失败,也就是接受ObjectOutputStream的writeObject方法的返回值的所属类的版本信息一定要跟存入文本时的对象所属类的版本信息一样(类名、成员、包名、工程名一样)
    5.如果序列化和反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个ServialVersionUID,那么当我们把对象存入文本中的时候jvm不会自己再算ServialVersionUID。这个就可以保证接受对象和存入对象的所属类的版本信息一样,我们也就可以修改成员了(我自己偏向于指定,毕竟有时候自己并不知道会不会修改)
    6.如果一个对象某些数据不想被序列化到硬盘上,那么对象的所属类的成员变量可以使用transient(中文:透明)修饰,这样就可以保证被修饰的数据就不会序列化到硬盘上,当然反序列的时候也得不到这个数据
    7.如果要被序列化对象所属类的内部维护了另一个类的引用,那么另一个类也需要实现Serializable接口,当然版本信息也需要相同

下面是一些实例:

class Work implements Serializable{

    private static final long serialVersionUID = 1L;
String workname;
double money; public Work(String workname , double money) {
this.workname = workname;
this.money = money;
}
} class People implements Serializable{
//指定版本编号
private static final long serialVersionUID = 1L;
transient int card; //身份证涉及隐私我们可以使用transient修饰,不序列化到硬盘中
String name;
int age; //维护一个另一个类的引用
Work work; public People(int card ,String name , int age,Work work) {
this.card = card;
this.name = name;
this.age = age;
this.work = work;
} //自定义输出格式
@Override
public String toString() { return "{省份证编号:"+this.card+" 姓名:"+this.name+" 年龄:"+this.age+" 工作:"+work.workname+" 工资:"+this.work.money+"}";
}
} public class Demo1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
writeObject();
readObject();
}
//序列化,把对象存入硬盘中
public static void writeObject() throws IOException {
//找到目标文件
File file = new File("D:\\新建文件夹\\a.txt");
//建立数据传输通道
FileOutputStream fileOutputStream = new FileOutputStream(file);
//建立对象的传输通道
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//序列化对象,写入硬盘
objectOutputStream.writeObject(new People(1001,"张三",18,new Work("打酱油",5000.0)));
objectOutputStream.writeObject(new People(1002,"李四",19,new Work("收酱油",5000.0)));
//关闭资源
objectOutputStream.close();//相当于fileOutputStream.close()
} //反序列化
public static void readObject() throws IOException{
//找到目标文件
File file = new File("D:\\新建文件夹\\a.txt");
//建立数据传输通道
FileInputStream fileInputStream = new FileInputStream(file);
//建立对象的传输通道
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
//读取文件
//EOFException 此异常主要被数据输入流用来表明到达流的末尾。
//注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。
People p;
while(true) {
try {
p = (People)objectInputStream.readObject();
System.out.println(p);
} catch(EOFException e) {
break;
}catch(ClassNotFoundException e) {
break;
}
}
objectInputStream.close();//相当于fileInputStream.close()
}
}

文件被序列化到文本中存储的内容

文件被反序列化

从这里我们可以发现,我们使用transient修饰的card没有被写入和读取出来(0是默认的初始值)

71 Serializable(序列化和反序列化)的更多相关文章

  1. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题a,什么叫序列化和反序列化b,作用.为啥要实现这个 Serializable 接口,也就是为啥要序列化c,seria ...

  2. [转]Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释

    原文地址:https://blog.csdn.net/qq_27093465/article/details/78544505 遇到这个 Java Serializable 序列化这个接口,我们可能会 ...

  3. 黑马程序员_Java基础:序列化(Serializable)与反序列化

    ------- android培训.java培训.期待与您交流! ---------- 在学习IO中的ObjectOutputStream和ObjectInputStream时,会涉及到序列化和反序列 ...

  4. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  5. 序列化与反序列化总结(Serializable和Parcelable)

    序列化是指将对象的状态信息转换为可以存储或传输的形式的过程. 在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复 ...

  6. 序列化、反序列化(Serializable特性)

    //需要被实例化的类 using System.Collections; using UnityEngine; [Serializable] public class SerializableClas ...

  7. 使用Serializable接口进行JAVA的序列化和反序列化

    OBJECT STREAMS – SERIALIZATION AND DESERIALIZATION IN JAVA EXAMPLE USING SERIALIZABLE INTERFACE Hite ...

  8. Serializable 接口与 Java 序列化与反序列化

    0. 序列化的意义 从内存到本地即为本地化或者在网络中进行传输,或叫序列化,持久化. 某 Java 类实现 Serializable 接口的目的是为了可持久化(简单理解为本地化),比如网络传输或本地存 ...

  9. Java 对象序列化和反序列化 (实现 Serializable 接口)

    序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.  把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...

随机推荐

  1. [几何]计算不规则多边形的面积、中心、重心(Android,转)

    转自:[几何]计算不规则多边形的面积.中心.重心 最近项目用到:在不规则多边形的中心点加一个图标.(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标) 之前的设计是,计算不规 ...

  2. Java中File的处理

    不知道“文件”和“文件路径”是否存在的处理情况 1.如果是文件,先获取文件父路径,没有就生成父路径,然后再生成文件. public class TestMain { public static voi ...

  3. css雪碧图实现数字切换

    vue中 css 雪碧图应用及数字切换demo 1. CSS Sprites一般只能使用到固定大小的盒子(box)里,这样才能够遮挡住不应该看到的部分. 2.使用css雪碧图的优点: 利用CSS Sp ...

  4. 【leetcode】982. Triples with Bitwise AND Equal To Zero

    题目如下: Given an array of integers A, find the number of triples of indices (i, j, k) such that: 0 < ...

  5. 根据mysql数据库 定义solr Schema.xml中配置业务域

    <!--product--> <field name="product_name" type="text_ik" indexed=" ...

  6. 【多线程】ConcurrentLinkedQueue 的实现原理

    1. 引言 在并发编程中我们有时候需要使用线程安全的队列.如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把 ...

  7. Ceph中PG和PGP的区别

    http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/ 一.前言 首先来一 ...

  8. [CSP-S模拟测试63]题解

    A.Median 这题的数据生成方式并没有什么规律,所以可以认为是随机数据. 维护一个桶,表示当前K长区间里的值域情况. 并且用变量记录中位数值域上的左侧有多少个数,当区间调整时一并调整桶和这个变量即 ...

  9. Python-字符串str和json格式的转换

    str转json str转换为json格式,前提一定需要保证这个str的格式和json是一致的,即左边最外层是大括号,右边的最外层是大括号.如果不一致,推荐用正则进行拆分至和json格式一致1. 通过 ...

  10. PAT甲级——A1150 TravellingSalesmanProblem【25】

    The "travelling salesman problem" asks the following question: "Given a list of citie ...