zoukankan      html  css  js  c++  java
  • 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.实现序列化要求

    只有实现了SerializableExternalizable接口的类的对象才能被序列化,否则抛出异常! 

     3.实现方法

    假定一个User类,它的对象需要序列化,可以有如下三种方法:
    
    (1)若User类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化
    
    ObjectOutputStream采用默认的序列化方式,对User对象的非transient的实例变量进行序列化。
    ObjcetInputStream采用默认的反序列化方式,对对User对象的非transient的实例变量进行反序列化。
    
    (2)若User类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。
    
    ObjectOutputStream调用User对象的writeObject(ObjectOutputStream out)的方法进行序列化。
    ObjectInputStream会调用User对象的readObject(ObjectInputStream in)的方法进行反序列化。
    
    (3)若User类实现了Externalnalizable接口,且User类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。
    
    ObjectOutputStream调用User对象的writeExternal(ObjectOutput out))的方法进行序列化。
    ObjectInputStream会调用User对象的readExternal(ObjectInput in)的方法进行反序列化。
  • 相关阅读:
    leetcode 1301. 最大得分的路径数目
    LeetCode 1306 跳跃游戏 III Jump Game III
    LeetCode 1302. 层数最深叶子节点的和 Deepest Leaves Sum
    LeetCode 1300. 转变数组后最接近目标值的数组和 Sum of Mutated Array Closest to Target
    LeetCode 1299. 将每个元素替换为右侧最大元素 Replace Elements with Greatest Element on Right Side
    acwing 239. 奇偶游戏 并查集
    acwing 238. 银河英雄传说 并查集
    acwing 237程序自动分析 并查集
    算法问题实战策略 MATCHORDER 贪心
    Linux 安装Redis全过程日志
  • 原文地址:https://www.cnblogs.com/bytecodebuffer/p/11916972.html
Copyright © 2011-2022 走看看