这是小小本周的第四篇

Java序列化是什么?

Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程。反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象。序列化:对象序列化的最重要的作用是传递和保存对象的时候,保证对象的完整性和可传递性。方便字节可以在网络上传输以及保存在本地文件。

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

实现分布式

核心在于RMI,可以利用对象序列化运行远程主机上的服务,实现运行的时候,就像在本地上运行Java对象一样。

实现递归保存对象

进行序列化的时候,单单并不是保存一个对象,而是递归的保存一整个对象序列,即递归保存,通过反序列化,可以递归的得到一整个对象序列。

序列信息可以永久保存

用于序列化的信息,可以永久保存为文件,或者保存在数据库中,在使用的时候,再次随时恢复到内存中,实现内存中的类的信息可以永久的保存。

数据格式统一

比照Linux的一切皆文件的思想,同时Java也是这样的思想,让数据格式尽可能的统一,让对象,文件,数据,等等许许多多不同的格式,都让其统一,以及保存。实现数据可以完整的传输和保存。然后进行反序列化还原,即,对象还是对象,文件还是文件。

实现Java序列化和反序列化

要进行反序列化需要实现一个接口。即 Serializabei接口。代码如下 需要转化的类

package common.lang;import java.io.Serializable;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;public class User1 implements Serializable{private String name;private int 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;}@Overridepublic String toString() {return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("name", name).append("age", age).toString();}
}

进行序列化,以及反序列化

package common.lang;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializableDemo1 {public static void main(String[] args) throws Exception, IOException {//初始化对象User1 user = new User1();user.setName("yaomy");user.setAge(23);System.out.println(user);//序列化对象到文件中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("template"));oos.writeObject(user);oos.close();//反序列化File file = new File("template");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));User1 newUser = (User1)ois.readObject();System.out.println(newUser.toString());}
}

另一个序列化接口 Externalizable

继续实现Externalizable接口

package common.lang;import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;public class User1 implements Externalizable{private String name;private int 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;}@Overridepublic String toString() {return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("name", name).append("age", age).toString();}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {// TODO Auto-generated method stub}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {// TODO Auto-generated method stub}
}

进行序列化以及反序列化

package common.lang;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializableDemo1 {public static void main(String[] args) throws Exception, IOException {//初始化对象User1 user = new User1();user.setName("yaomy");user.setAge(23);System.out.println(user);//序列化对象到文件中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("template"));oos.writeObject(user);oos.close();//反序列化File file = new File("template");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));User1 newUser = (User1)ois.readObject();System.out.println(newUser.toString());ois.close();}
}

查看输出的结构

common.lang.User1@6ef64f64[name=yaomyage=23
]
common.lang.User1@184c9860[name=<null>age=0
]

根据输出的结果可以看到,对User1进行序列化然后再反序列化之后对象的属性都恢复成了默认值,即,之前那个对象的状态没有被持久保存下来,这就是Externalization和Serialization接口的区别,其中前者接口会被恢复成为默认值,后者接口不会恢复默认值。

如果需要恢复,这里就需要重写两个抽象方法,分别是writeExternal与readExternal两个抽象方法。

package common.lang;import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;public class User1 implements Externalizable{private String name;private int 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;}@Overridepublic String toString() {return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("name", name).append("age", age).toString();}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(name);out.writeInt(age);}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name = (String)in.readObject();age = in.readInt();}
}
package common.lang;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;public class SerializableDemo1 {public static void main(String[] args) throws Exception, IOException {//初始化对象User1 user = new User1();user.setName("yaomy");user.setAge(23);System.out.println(user);//序列化对象到文件中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("template"));oos.writeObject(user);oos.close();//反序列化File file = new File("template");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));User1 newUser = (User1)ois.readObject();System.out.println(newUser.toString());ois.close();}
}

输出的结果

common.lang.User1@6cd66725[name=yaomyage=23
]
common.lang.User1@19160e64[name=yaomyage=23
]

静态变量的序列化

实例

public class Test implements Serializable {private static final long serialVersionUID = 1L;public static int staticVar = 5;public static void main(String[] args) {try {//初始时staticVar为5ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));out.writeObject(new Test());out.close();//序列化后修改为10Test.staticVar = 10;ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj"));Test t = (Test) oin.readObject();oin.close();//再读取,通过t.staticVar打印新的值System.out.println(t.staticVar);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

代码阐述一下过程,在main方法中,对象序列化以后,修改静态变量的数值,再把序列化后的对象读取出来,此时输出的值为10. 理解如下:打印的staticVar是从读取对象里获得的,打印10的原因是因为序列化时,不保存静态变量,只保存内存中的状态。此时修改静态变量的值,修改的是类中的值,输出的也是类中的值,和内存无关。

Transient关键字

Transient关键字,加上以后,可以阻止该变量被序列化到文件中,反序列化以后,变量的值设定为初始值。

小明菜市场

推荐阅读

● 面试 | 从一个API缓存演化,详细了解Redis各项功能

● 理论 | 六种延迟队列的实现方案

● 实战 | Element UI 父子组件传值与事件绑定(逆向)

● 实战 | Element UI 父子组件传值与事件绑定(正向)

● 实战 | Vue + Element UI 表格组件二次封装

理论 | 教你彻底学会Java序列化和反序列化相关推荐

  1. 教你彻底学会Java序列化和反序列化

    Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象 ...

  2. java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  3. Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

  4. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  5. java序列化和反序列化以及序列化ID的作用分析

     java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...

  6. java序列化和反序列化_Java恶意序列化背后的历史和动机

    java序列化和反序列化 与Java的序列化机制相关的问题已广为人知. 有效的Java 1st Edition (第10章)和有效的Java 2nd Edition (第11章)的整个最后一章都专门讨 ...

  7. Java序列化与反序列化(一)

    目录 序列化与反序列化 1.最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:transient 5. 父类的序列化 6. 自定义序列 ...

  8. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

  9. Java 序列化与反序列化

    Java 序列化与反序列化 文章目录 Java 序列化与反序列化 1 序列化与反序列化的概念 2 核心类与关键字总览 3 序列化与反序列化的过程 3 应用示例 4 序列化版本号的作用 serialVe ...

最新文章

  1. 在线作图|在线做协惯量分析(CoIA)
  2. 【蓝桥杯】历届试题 地宫取宝
  3. ActiveMQ跑起来
  4. CM: word template merge 工具
  5. 前端笔试题小结(一)
  6. 三丰三坐标编程基本步骤_加工中心开机回零的两种基本方式及常见问题的应对方法...
  7. asteroids模板 游戏 java_在高级Java游戏中存储全局/静态变量的最佳方法是什么?...
  8. cocos2d-x基于windows平台交叉编辑android工程
  9. Zend Framework 入门(1)—快速上手
  10. Visual Studio 2017正式版离线安装方法
  11. 浅析bin,lib,src的区别
  12. FPGA的工作原理简述
  13. 科技传播杂志科技传播杂志社科技传播编辑部2022年第9期目录
  14. 盲人的福音:布里斯托大学团队让AI学会了键入盲文
  15. Spring AOP具象化理解(代理模式)
  16. arm方案商,三星S5P6818开发板ARM Cortex-A53架构
  17. php站长统计,PHP统计各大引擎蜘蛛爬行访问记录插件
  18. 名人堂与代金券 (25 分)(C语言)(链表实现)
  19. 目标检测 --- Anchor的生成
  20. java 汇编_大话+图说:Java 汇编指令——只为让你懂

热门文章

  1. 常见的mysql权限设置
  2. 系统什么时候会用到swap分区?
  3. 初识数据中心Mesos
  4. IT公司100题-14-排序数组中和为给定值的两个数字
  5. 内核同步机制之Mutex Exclusion
  6. Ubuntu 13.04开机亮度调节
  7. ALTER INDEX Rebuild Reorganize 索引 重建 重组 碎片率
  8. 程序员的进阶课-架构师之路(11)-最容易理解的红黑树
  9. 各种一维卷积(Full卷积、Same卷积、Valid卷积、带深度的一维卷积)
  10. linux添加硬盘永久挂载,linux新增硬盘如何挂载