一.java序列化与反序列化

序列化是指把java对象(属性)转换为字节序列的过程

反序列化是指把字节序列恢复为java对象的过程

二.为什么需要序列化和反序列化

首先网络通信都是二进制的形式在传输,本地存储也是这样,那么如果我们需要在网络远程传输java对象,或者想将java对象状态持久化到磁盘,那么我们就需要这个对象可以序列化(转换为字节序列)

知道了序列化那反序列化应该也就知道了,就是将网络间传输的、磁盘上保存的对象的字节序列恢复为java对象

三.java如何实现序列化

1.jdk中的API

java.io.ObjectOutputStream:对象输出流

它的writeObject(Object obj)方法可以对obj对象进行序列化,把得到的字节序列写到一个目标输出流中

java.io.ObjectInputStream:对象输入流

它的readObject()方法从输入流中读取字节序列,再反序列化为一个对象,并将其返回;此方法返回的对象顺序和writeObject方法添加进去的对象顺序相同

2.序列化要求

需要实现Serializable或者Externalizable接口,否则抛出异常

Externalizable继承自Serializable,并添加了俩方法:

writeExternal(ObjectOutput out)readExternal(ObjectInput in)

3.实现java对象序列化和反序列化

假设一个User类,它的对象需要序列化

方法一:若User类仅仅实现了Serializable接口,则可以按照以下方法进行序列化和反序列化

ObjectOutputStream采用默认的序列化方式(writeObject方法),对User对象的所有非transient的实例变量进行序列化

ObjectInputStream采用默认的反序列化方式(readObject方法),对User对象的所有非transient的实例变量进行反序列化

方法二:若User类仅仅实现了Serializable接口,并且还定义了private void readObject(ObjectInputStream in)和private void writeObject(ObjectOutputStream out),则采用以下方式进行序列化和反序列化

ObjectOutputStream的writeObject方法会调用User对象的writeObject(ObjectOutputStream out)的方法进行序列化。

ObjectInputStream的readObject方法会调用User对象的readObject(ObjectInputStream in)的方法进行反序列化。

备注:User类中的writeObject方法和readObject方法是private的,ObjectOutputStream类在调用自身的writeObject方法的时候会检测User类中是否存在writeObject方法,如果存在就通过反射机制调用User自己的writeObject

方法三:若User类实现了Externalnalizable接口,且User类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化

ObjectOutputStream调用User对象的writeExternal(ObjectOutput out))的方法进行序列化

ObjectInputStream调用User对象的readExternal(ObjectInput in)的方法进行反序列化

备注:实现此接口的类在进行序列化和反序列化的时候所有想保存状态的属性都要手动在writeExternal和readExternal方法中write和read

四.实例

//User.java

public class User implementsSerializable{private static final long serialVersionUID = 1L;

String name;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

@OverridepublicString toString() {return "User [name=" + name + "]";

}

}

测试

public static void main(String[] args) throwsFileNotFoundException, IOException, ClassNotFoundException {

ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("D:\\u.src"));

User u= newUser();

u.setName("name1");

oos.writeObject(u);

User uu= newUser();

uu.setName("name2");

oos.writeObject(uu);

oos.flush();

oos.close();

ObjectInputStream ois= new ObjectInputStream(new FileInputStream("D:\\u.src"));

User o=(User)ois.readObject();

User oo=(User)ois.readObject();

System.out.println(o);

System.out.println(oo);

}

结果:

User [name=name1]

User [name=name2]

五.

java序列化层数_java序列化详解相关推荐

  1. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  2. java method 注解_JAVA 注解详解及简单实例

    JAVA 注解详解及简单实例 何为注解 注解(Annotation)又称为元数据,在JDK1.5后引入,它的作用是: 生成文档  这是注解的原始用途,可以通过注解生成JavaDoc文档 跟踪代码的依赖 ...

  3. java泛型 初始化_Java泛型详解

    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有 ...

  4. java递归函数例子_Java递归函数详解附案例

    递归函数在Java语言中得到了广泛的应用,它使得程序的编写过程更加的清晰明了.对Java初学者来讲,递归函数是需要学习的一个重要知识点.本文将附上案例和演示代码,具体为大家介绍递归函数的概念.要素以及 ...

  5. java iterator对象_JAVA Iterator 详解 代码

    Iterator接口 1.所有实现了Collection接口的容器类都有一个Iterator方法用以返回一个实现了Iterator接口的对象 2.Iterator对象称为迭代器,用以方便的操作实现对象 ...

  6. java 函数内部类_java 内部类详解 转

    classOuter {classInner { } } (二) 内部类的访问规则 ​ A:可以直接访问外部类的成员,包括私有 ​ B:外部类要想访问内部类成员,必须创建对象 (三) 内部类的分类 ​ ...

  7. Java注解库_Java 注解详解

    本文部分摘自 On Java 8 基本语法 注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影 ...

  8. java打包维护_java打包详解

    from yahh2008的blog:  http://www.matrix.org.cn/blog/yahh2008/ 兄弟,对java着迷吗,或者是为了自己的生计,不论怎样都欢迎你进入精彩java ...

  9. java threadsafe 注解_Java 注解详解

    什么是注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解.而新手很难理解的主要原因是一些技术文档里的专业术语和名词不太 ...

最新文章

  1. Jquery的html方法里包含特殊字符的处理,类似双引号之类的
  2. cve-2018-1273 Spring Expression Language 漏洞分析
  3. linux ubuntu debian apt-get报错 Unable to acquire the dpkg frontend lock 解决方法
  4. 深耕“有温度”的金融服务:平安银行“健康财富节”背后的人本主义
  5. hdu -4284 Travel(状态压缩)
  6. 第二章 OpenResty(Nginx+Lua)开发入门
  7. MySQL令人头疼的Aborted告警案例分析
  8. ubuntu: ssh: connect to host ubuntu port 22: No route to host
  9. clang 反汇编
  10. Android UI学习之ListView(使用ArrayAdapter和SimpleAdapter)
  11. 倾心家教安卓案例开发代码_你或许从未听过的20个安卓开发工具
  12. 6.1行为型模式--模板方法模式
  13. iscsi_server_client_chap_username_password_targetcli
  14. MPB:南农韦中组-​根际细菌群落资源利用网络的研究方法
  15. Mysql sql 对行数据求和
  16. VS2015编译时“ The POSIX name for this item is deprecated.”的分析
  17. 抖音算法2023届秋招快上车
  18. 数据结构学习——RBT(红黑树)以及实现Map和Set
  19. 王学岗Kotlin协程(三)---协程的上下文与协程的异常处理
  20. 安卓开发之EventBus使用

热门文章

  1. Unity Application Block 3月12 发布的版本
  2. 【JAVA高级】——myEclipse连接mysql启动数据库服务
  3. SSO (单点登录)实现方式
  4. Thinapp的昨天,今天和明天
  5. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍
  6. mongodb 导出数据
  7. 无意中发现Markdown,最终解放了我
  8. CentOS系统缺少库文件解决办法
  9. SQL Server 数据加密功能解析
  10. NoSQL解决方案比较