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)的方法进行反序列化。

原文地址:https://www.cnblogs.com/baizhuang/p/11916972.html

时间: 2024-10-08 00:58:49

Java 中序列化与反序列化引发的思考?的相关文章

java中序列化与反序列化的冷知识

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 关于什么是序列化,和为什么要序列化的知识就不再阐述了,本文主要探讨一些特殊点的情况. 1.java中如何实现序列化和反序列化 下面的代码是进行序列化的简单实例 public static void main(String[] args) { System.out.println("-----------------序列化----------------------↓"); Student stu

Java的序列化与反序列化

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的对象传送

Java对象序列化和反序列化

Java对象序列化和反序列化 在Java中,我们如果要保存一个对象的瞬时状态值,以便在下次使用时能够得到这些值,或者持久化对象,或者使用RMI(远程方法调用),或在网络中传递对象时,此时我们就需要将对象序列化,实现序列化,我们只要实现Serializable接口,该接口是一个标记接口(Tag interface),即里面没有方法,其主要作用就是告诉JVM该类的对象可以进行序列化. 一般来说,很多类的对象都实现了Serializable接口,但是,有些对象是不能进行序列化的,比如与数据库相关的连接

java 对象序列化与反序列化

Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节序列的过程: Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的

Java对象序列化与反序列化

Java对象序列化与反序列化 对象序列化的目标是将对象保存在磁盘中或者在网络中进行传输.实现的机制是允许将对象转为与平台无关的二进制流. java中对象的序列化机制是将允许对象转为字节序列.这些字节序列可以使Java对象脱离程序存在,从而可以保存在磁盘上,也可以在网络间传输. 对象的序列化是将一个Java对象写入IO流:与此对应的,反序列化则是从IO流中恢复一个Java对象. 实现序列化 如果要将一个java对象序列化,那么对象的类需要是可序列化的.要让类可序列化,那么这个类需要实现如下两个接口

php中序列化与反序列化在utf8和gbk编码中测试

在php中如果我们统一编码是没有什么问题了,但是很多朋友会发现一个问题就是utf8和gbk编码中返回的值会有所区别: php 在utf8和gbk编码下使用serialize和unserialize互相序列化和反序列化会出现无法成功反序列化的问题. 问题出现的原因主要是在不同编码下strlen函数计算中文字符串长度不同的原因. <?php $array=array('title'=>'php教程分享网','url'=>'http://www.111cn.net'); echo serial

java 打印流 递归复制子文件子文件夹 不同编码文件复制到同一文件中 序列化流反序列化流

package com.swift.jinjie; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; /*从键盘输入一个文件夹路径,利用打印流将该文件夹下的所有文件(包括子文件夹)复制到D盘下temp文件夹下.*/ public class PrintAllT

java开发中序列化与反序列化起到的作用

基本概念: 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 特别在网络传输中,它的作用显得尤为重要.我们可以把一个类实现序列化,然后在另一端通过反序列化可以得到该对象 例如:我们可以序列化一个对象,不过这个对象要实现序列化方法,并生成序列化号. 这是对一个对象进行序列化和反序列化的过程: public static byte[] serializeObj(Object object){ if (obje

【转】Java对象序列化和反序列化

[转自]孤傲苍狼的Java基础学习总结——Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对 象,当有 10万用户并发访问,就有可