Java 中序列化与反序列化引发的思考?
java 中序列化指从对象转变为 二进制流的过程中需要进行序列化,而反序列化指二进制流转换为java 对象。那么有的时候java 存储到数据库不需要序列化,
而计算机系统本质存储的就是二进制文件,数据库的本质又是什么呢?
一、从硬件说起
核心五部分:运算器、控制器、存储器、输入设备、输出设备
根据冯诺伊曼计算机原理,计算机除了五部分外,存储用于存放指令与数据,运算器完成算数与逻辑运算,外部人员通过输入/输出设备操作计算机,且计算机内部是使用二进制表示指令与数据。
其中指定由操作码和地址吗构成,操作码指操作类型,地址码指一串指令程序。那么对于数据库中的各种数据类型,存储结构是如何型成的呢?

目前现代计算机的组成

二、软件系统
软件宏观的分为:系统软件、应用软件

看到这里,数据库管理系统和操作系统均属于系统软件。

操作系统是覆盖在硬件上的第一层软件,管理计算机硬件与软件资源。并向用户提供良好的界面。操作系统与硬件相关,直接管理硬件资源,为用户完成硬件相关的操作,从而极大的提高了对硬件资源的使用与利用率。
操作系统是一种特殊的系统软件,其他系统软件运行在操作系统上,可以获得操作系统提供的大量服务。也就是说操作系统是其他系统软件与硬件之间的接口。一般用户使用计算机除了需要操作系统支持外,还需要用到
大量的其他系统软件和应用软件。

三、数据库系统
数据库系统,DBS ,是指计算机系统中引入数据库后构成的系统,一般有数据库系统,应用系统,数据库管理员,用户构成。
数据库系统是为了解决数据独立存储的问题。

在这里大胆的猜想:数据库系统是为了统一数据存储而出现的,那么对于计算机本质存储的是二进制进行的统一。使得面向数据库的数据类型是非二进制的,是数据库系统定好的数据类型,那么只需要按数据库的规则去存储,
至于数据库类型的本质,咋数据库系统内部会做处理。不过我想最终还是二进制,应为计算机只能存储二进制。而扩展的文件系统,需要思考存储的到底是什么?目前思维有限,假设我们不需要考虑数据库系统内部是如何实现
想存储器映射的,我们只关系数据库系统支持哪些数据类型。我们把数据存储到数据库即等价于存储到计算机。
Java 开发的存储面向的是数据库,那么JAVA 如何向数据库存储数据?回归本质,序列化与反序列化有是为何?
四、编程语言
首先,什么是编程语言?目前常用的编程语言:C 语言,C++,Java , C#, Python ,PHP , JavaScript ,Go ,Object-c ,Swift, 汇编语言等
语言有很多种,但是可以达到相同的目的,可以选择任何一种语言去控制计算机。
我们用语言来控制计算机,让计算机为我们做事情没这样的语言就是编程语言。编程语言有许多种,每种都有自己擅长的方面

可以将不同的汇编语言比喻成各国语言,为了表达同一个意思,可能使用不同的语句。比如世界你好的意思:
- 汉语:世界你好;
- 英语:Hello World
- 法语:Bonjour tout le monde
在编程语言种,统一可以实现
- C语言:puts("C语言中文网");
- PHP:echo "C语言中文网";
- Java:System.out.println("C语言中文网");
编程语言类似于人类语言,由直观的词汇组成,必须符合它固有的格式,否则计算机不会识别
五、回归Java 序列化与反序列化
序列化: 把对象转换为字节序列化存储于磁盘或者进行网络传输的过程称为对象的序列化。
反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列话。
Java 种实现序列化的接口: Serializable : Java.io.Serializable
serialVersionUID: 序列化的版本好,凡是实现序列化接口的类都有一个静态达到表示序列化版本表示的变量
参考:https://blog.csdn.net/xlgen157387/article/details/79840134
- .什么是序列化和反序列
- Java序列化是把Java对象转换为字节序列的过程,而Java 反序列化是指把字节恢复为Java对象的过程
- 序列化: 对象序列化最主要的用处是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了 Java 对象的状态以及相关的描述信息。
- 序列化的核心就是对象状态的保存与重建
- 反序列化: 客户端从文件中或者网络上获取序列化后的对象字节流后,根据字节流中所保存的对象状态以及描述信息,通过反序列化重建对象。
- 本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。
- 为什么要序列化与反序列化
- 我们知道,当2个进程进行远程通信时,可以互相发送各种类型的数据,包括文本,图片,音频,视频等。而这些数据都会以二进制序列的形式在网络上传送。那么当2个Java进程通信时,能否实现进程间对象的传递呢?答案是可以的,就需要Java
- 序列化与反序列化。换句话来说,发送方需要把这个Java对象转换为字节序列,然后在网络上传送,另一方面,接收方需要从字节序列中恢复Java 对象
- 序列化的好处:01 实现了数据的持久化,可以讲数据存储到磁盘。 02 利用序列化实现远程通信,即在网络上传递对象的字节序
- 总结
- 1.永久性保存对象,保存对象的字节序列到本地文件或者数据库中
- 2 通过序列化以字节流的形式使对象在网络中进行传递与接受
- 3 通过序列化在进程间传递
- 序列化算法实现
- 1.将对象实例相关的类元数据输出
- 2.递归第输出类的超类描述直到不再有超类
- 3.类元数据完了后,开始从最顶层的超类开始输出对象实例的实际数据值
- 4.从上至下递归输出实例的数据
六、Java 如何实现序列化与反序列化的
1. JDK 类库中序列化与反序列化API
java.io.ObjectOutputStream,writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
java.io.ObjectInputStream,readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回;
2.实现序列化要求
只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常!
3.实现方法
假定一个User类,它的对象需要序列化,可以有如下三种方法: ()若User类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化 ObjectOutputStream采用默认的序列化方式,对User对象的非transient的实例变量进行序列化。
ObjcetInputStream采用默认的反序列化方式,对对User对象的非transient的实例变量进行反序列化。 ()若User类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。 ObjectOutputStream调用User对象的writeObject(ObjectOutputStream out)的方法进行序列化。
ObjectInputStream会调用User对象的readObject(ObjectInputStream in)的方法进行反序列化。 ()若User类实现了Externalnalizable接口,且User类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。 ObjectOutputStream调用User对象的writeExternal(ObjectOutput out))的方法进行序列化。
ObjectInputStream会调用User对象的readExternal(ObjectInput in)的方法进行反序列化。
Java 中序列化与反序列化引发的思考?的更多相关文章
- Java 中序列化与反序列化
一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...
- JAVA中序列化和反序列化
一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失(java回收机制)但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运 ...
- JAVA中序列化和反序列化中的静态成员问题
关于这个标题的内容是面试笔试中比较常见的考题,大家跟随我的博客一起来学习下这个过程. ? ? JAVA中的序列化和反序列化主要用于: (1)将对象或者异常等写入文件,通过文件交互传输信息: (2)将对 ...
- Java中由常量类引发的思考
我们都知道,定义一个常量类是十分简单的.首先差固件一个类,然后类中声明一些public修饰的静态常量.没错就这么简单: 写好之后,在其他地方使用的时候,直接类名.属性名就可以使用了. 而LZ现在想的是 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- Java之序列化和反序列化
序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
- Java对象序列化与反序列化一 JSON
Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student { private String nam ...
随机推荐
- HTML5学习(2)语义化
什么是语义化? 1.每一个HTML元素都有具体的含义,例: a元素:超链接,p元素:段落 2.所有的元素与展示效果无关 元素内容展示到页面中的效果,应该由CSS决定. 因为浏览器带有默认的CSS样式, ...
- 杭电oj初体验之 Code
PLA算法: https://blog.csdn.net/red_stone1/article/details/70866527 The problem: Analysis: 题目链接可见:https ...
- IntelliJ IDEA 2017.3尚硅谷-----修改类头的文档注释信息
/** @author shkstart @create ${YEAR}-${MONTH}-${DAY} ${TIME} */ ${PACKAGE_NAME} - the name of the ta ...
- IntelliJ IDEA 2017.3尚硅谷-----创建工程
- 概率dp light 1321
题意:给定一张无向图,每条边都有一个通过的概率 ,如果无法通过,那么就要回到起点重新出发从起点到终点的时间固定为K,如果成功到达,又需要额外花费K的时间,问走S次的最小期望时间 思路:这道题分为两部分 ...
- 题解【洛谷P2853】[USACO06DEC]牛的野餐Cow Picnic
题目描述 The cows are having a picnic! Each of Farmer John's \(K (1 ≤ K ≤ 100)\) cows is grazing in one ...
- 折纸(folding)
问题 C: 折纸 时间限制: 1 Sec 内存限制: 128 MB[提交] [状态] 题目描述 现有一个W*H的矩形纸张,求至少要折多少次才能使矩形纸张变成w*h的矩形纸张.注意,每次的折痕都要平行 ...
- Docker - Docker Engine 结构结构概述
概述 Docker Engine 结构的简单描述 ref docker 实战 第一本 docker 书 1. docker 版本 1. 版本 Docker Engine - Community 概述 ...
- RedHat7 / CentOS 7 忘记root密码修改
摘自:https://blog.csdn.net/bubbleyang/article/details/91360856 进入互动式命令环境 开机出现 grub boot loader 开机选项菜单时 ...
- hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)
Hadoop介绍——HA与联邦 0.1682019.06.04 13:30:55字数 820阅读 138 Hadoop 1.0中HDFS和MapReduce在高可用.扩展性等方面存在问题: –HDFS ...