java 序列化和反序列化的实现原理
老是听说序列化反序列化,就是不知道到底什么是序列化,什么是反序列化?今天就在网上搜索学习一下,这一搜不要紧,发现自己曾经用过,竟然不知道那就是JDK类库中序列化和反序列化的API。
----什么是序列化?
--1--java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程
--2--序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存的java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
--3--反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。
--4--序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态
----为什么需要序列化与反序列化
当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本,图片,音频,视频等,而这些数据都会以二进制的形式在网络上传送。
当两个java进行进行通信时,要传送对象,怎么传对象,通过序列化与反序列化。
也就是说,发送方需要把对象转换为字节序列,然后在网络上传送,另一方面,接收方需要从字节序列中恢复出java对象
----序列化的好处
--1--永久性保存对象,保存对象的字节序列到本地文件或者数据库中,实现了数据的持久化,通过序列化可以把数据永久的保存到硬盘上,
--2--利用序列化实现远程通信,可以在网络上传送对象的字节序列。
--3--在进程间传递对象
----序列化算法步骤
--1--把对象实例相关的类元数据输出
--2--递归输出类的超类描述直到不再有超类
--3--类元数据完了以后,开始从最懂曾的超类开始输出对象实例的实际数据值。
--4--从上至下递归输出实例的数据
----Java 如何实现序列化和反序列化
--1-- JDK类库中序列化API
java.io.ObjectOutputStream: 表示输出对象流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
--2--java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回
--2--实现序列化的要求
只有实现了Serializable或Externalizable接口的对象才能被序列化,否则抛出异常!
--3--实现java对象序列化与反序列化的方法
例 a 类,它的对象需要序列化,有3种方法
如果类a仅仅实现了Serializable接口,则
ObjectOutputStream采用默认的序列化方式,对a对象的非transient实例变量进行序列化
ObjectInputStream采用默认的反序列化方式,对a对象的非transient实例变量进行反序列化
如果类a仅仅实现了Serializable接口,并且还定义了a对象的writeObject(ObjectOutputStream out) 和readObject(ObjectInputStream in),则
ObjectOutputStream调用a对象的writeObject(ObjectOutputStream out)的方法进行序列化
ObjectInputStream调用a对象的readObject(ObjectInputStream in)的方法进行序列化
如果a类实现了ExternaInalizable接口,且User类必须实现readExternam(ObjectInput in)和wiriteExternal(ObjectOutput out)方法,则
ObjectOutputStream调用a对象的wiriteExternal(ObjectOutput out)的方法进行序列化
ObjectInputStream调用a对象的readExternam(ObjectInput in)的方法进行序列化‘’
----JDK类库中序列化的步骤
--1--创建一个对象输出流,它可以包装一个奇特类型的目标输出流,如文件输出流:
objectOutputStream oos=new objectOutputStream(new FileOutStream(c:\\object.out));
--2--通过对象输出流writeObject()方法写对象:
oos.writeObject(new a("xiaoxiao","145263","female"));
----JDK类库中反序列化的步骤
--1--创建一个对象输入流,它可以包装一个其他类型输入流,如文件输入流:
objectInputStream ois=new ObjectInputStream(new FileInputStream("object.out"));
--2--通过对象输出流的readObject()方法读取对象:
a aa=(a)ois.readObject();
--3--为了正确读数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致
----例子
import java.awt.print.Printable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; public class SerialDemo {
public static void main(String[] args) throws IOException,ClassNotFoundException{ FileOutputStream fos =new FileOutputStream("object.out");
ObjectOutputStream oos=new ObjectOutputStream(fos);
User user1=new User("xiaoming","145263","female");
oos.writeObject(user1);
System.out.print(oos);
oos.flush();
oos.close(); FileInputStream fis=new FileInputStream("object.out");
ObjectInputStream ois=new ObjectInputStream(fis);
User user2=(User) ois.readObject();
System.out.print(user2.getUserName("xiaoming")+" "+ user2.getPassword("145263")+" " + user2.getSex("female"));
}
} import java.io.Serializable; public class User implements Serializable {
public User(String string, String string2, String string3) {
// TODO Auto-generated constructor stub
}
private String userName;
private String password;
private String sex; public String getUserName(String userName) {
return userName;
}
public String getPassword(String password) {
return password;
}
public String getSex(String sex) {
return sex;
}
}
文件位置
学习自 : https://blog.csdn.net/xlgen157387/article/details/79840134
java 序列化和反序列化的实现原理的更多相关文章
- java 序列化和反序列化的底层实现原理
出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...
- Java 序列化和反序列化(一)Serializable 使用场景
目录 Java 序列化和反序列化(一)Serializable 使用场景 1. 最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:tr ...
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- [转] Java序列化与反序列化
原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...
- Java序列化与反序列化(Serializable)
Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...
- Java基础(五)-Java序列化与反序列化
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...
- JAVA序列化和反序列化XML
package com.lss.utils; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.Bu ...
- Java序列化与反序列化(实践)
Java序列化与反序列化(实践) 基本概念:序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 昨天在一本书上 ...
- java序列化与反序列化(转)
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
随机推荐
- 1、 LwIP协议栈规范翻译——简介
1.简介 在过去几年中,计算机和计算机支持设备接之间的互联到无线网络日趋增加.计算机已经越来越无缝的集成在了日常的设备且价格也在下降.同时,无线网络技术例如蓝牙[HNI+98]和IEEE802.11b ...
- finecms如何调用多个栏目的子栏目
前面我们说到了finecms如何调用多个指定栏目的内容,finecms如何调用多个栏目的子栏目呢?用下面的代码就可以实现了,其中id是具体的栏目id,用“,”逗号隔开 {list action=cat ...
- 运维自动化ansible基础
云计算三种服务架构 IAAS: 不提供OS 只购买硬件(网络,存储,计算) PAAS: 提供硬件和OS和开发和运行环境 只需要开发应用软件 SAAS: 提供 硬件 os 软件 相当于直接购买软 ...
- MSDN、OEM、VOL、RETAIL密钥区别
本文就介绍一下Windows的密钥的一些使用要点及注意事项,涉及到最常用的MSDN密钥.OEM密钥.VOL密钥和零售密钥激活问题,希望对大家有所帮助. 一.MSDN密钥 MSDN密钥是付费用户提前获得 ...
- ArcGIS工具备忘
1.Repair Geometry (Data Management) 几何图形修复,比如面图层不满足节点坐标逆时针 2.Raster Domain (3D Analyst) 获取栅格范围 3.Int ...
- HTTP协议(TCP/IP)
HTTP协议(TCP/IP): 服务器套接字(TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口) 数据包(请求包.报文)http 请求格式: ...
- 虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还是httpd.conf
https://blog.csdn.net/weisubao/article/details/43536723 解决方案:虚拟主机是设置在httpd-vhosts.conf还是vhosts.conf还 ...
- CentOS里alias命令
alias命令 功能描述:我们在进行系统的管理工作一定会有一些我们经常固定使用,但又很长的命令.那我们可以给这些这一长串的命令起一个别名.之后还需要这一长串命令时就可以直接以别名来替代了.系统中已经有 ...
- 2019.03.25 Ajax三级联动
所谓三级联动就是,一层接着一层,根据上一层的选择给出这一层的结果 如选择市之后,会给出相应的区,然后到相应的县这就是联动 配置视图 from django.core import serialize ...
- 22-Python3 输入和输出
''' 输出格式美化 ''' s = 'Hello,Runoob' #repr():将输出读值转化成字符串,产生一个解释器易读读字符 print('repr():',repr(s)) #str():将 ...