文档章节

1.什么是序列化与反序列化?

刺猬一号
 刺猬一号
发布于 2017/05/24 20:28
字数 810
阅读 18
收藏 0

序列化:指将对象的状态数据以字节流的形式进行处理,在文件中长期存储。 
反序列:从字面上就能知道,指的就是在需要的时候从文件中获取该对象的信息以重新获得一个完全的对象。

2.序列化与反序列化的作用?

(1)永久性保存对象,把对象通过序列化字节流保存到本地文件中。 
(2)通过序列化在网络中传递对象 
(3)通过序列化在进程间传递对象

3. 实现序列化的两种接口

(1)Serializable接口 
(2)Externalizable接口:该接口继承了Serializable接口,是对Serializable的扩展,并提供了readExternal(ObjectInput in)和writeExternal(ObjectOutout out)两种方法,通过重写这两个方法来实现自身的序列化行为的控制。在对实现了Externalizable的类的对象进行反序列化时,会先调用该类的无参构造函数,若无参构造函数被删除或被设置为private、default或protected时会抛出Java.io.InvalidException:no valid construction等

4. 对象的序列化编码步骤

1)序列化实现步骤: 
(1)需要序列化的对象所属类必须实现Serializable接口; 
(2)构造FileOutputStream对象; 
(3)构造ObjectOutputStream对象; 
(4)使用ObjectOutputStream对象的writeObject()方法进行序列化; 
(5)关闭ObjectOutputStream对象; 
(6)关闭FileOutputStream对象; 
(7)对序列化全程捕获IOException;

2)反序列化实现步骤: 
(1)需要序列化的对象所属类必须实现Serializable接口; 
(2)构造FileInputStream对象; 
(3)构造ObjectInputStream对象; 
(4)使用ObjectInputStream对象的readObject()方法进行反序列化; 
(5)关闭ObjectInputStream对象; 
(6)关闭FileInputStream对象; 
(7)对序列化全程捕获ClassNotFoundException和IOException;

3)注意: 
1. 只有实现了Serializable或Externalizable的类的对象才可以实现序列化。 
2. 对象和对象数组都可以实现序列化 
3. 若一个父类实现了Serializable或Externalizable接口,其子类均实现了Serializable或Externalizable接口。 
4. 实现Serializable或Externalizable接口的类应提供无参构造函数 
5. static的属性和方法不能被序列化,因为static的属性和方法与对象无关,而序列化和反序列化则是针对对象而言的。 
6. 对于不希望被序列化的非static成员和方法可以使用transient关键字标明.(关于transient关键字的用法参考博文Java的transient关键字
7.若一个序列化子类的父类是非序列化的,则该子类从父类继承下来的变量将恢复其默认初始值而不被初始化。

示例代码:

package effectivejava;

import java.io.*;
import java.util.Date;

/**
 * Created by louyuting on 16/11/11.
 * 序列化与反序列化
 */
class Customer implements Serializable{
    private String name;
    private String age;

    public Customer() {
    }

    public Customer(String age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "name=" + this.name + ", age="+this.age;
    }
}

public class SerializableTest {


    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //获取序列化对象
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/opt/objectFile.obj"));

        Customer customer = new Customer("娄宇庭", "24");
        out.writeObject("你好!");
        out.writeObject(new Date());
        out.writeObject(customer);
        out.close();

        //反序列化对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("/opt/objectFile.obj"));
        System.out.println("obj1:"+ (String)in.readObject());
        System.out.println("obj2:"+ (Date)in.readObject());
        System.out.println("obj3:"+ (Customer)in.readObject());
        in.close();
    }

}
  • 运行结果: 

这里写图片描述

© 著作权归作者所有

刺猬一号
粉丝 12
博文 373
码字总数 616361
作品 0
深圳
私信 提问
HashMap要自己实现writeObject和readObject方法?

现象如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。private void writeObject(java.io.ObjectOutputStream s) throws IOExceptionprivate void rea...

hello菜bird
2016/09/01
22
0
序列化之Parcelable和Serializable

序列化与反序列化 1.Parcelable和Serializable有什么用,它们有什么差别? Parcelable和Serializable是两个接口,它们的作用是让实现了其中一个接口的类的对象能够被序列化和反序列化。 (1)S...

Jdqm
2017/12/31
0
0
为什么HashMap要自己实现writeObject和readObject方法?

现象 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 这两个方法有两个共同点: 都是私有方法 虽然是私有方法,但是在HashMap内部却找不到任何调用...

newever
2016/08/20
437
0
(1)java序列化--java.io.Serializable接口解析

(PS:本文为作者原著,如需转载,请注明出处-_^) 使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看...

sumekey
2011/09/07
0
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
2018/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部