你真的了解java序列化吗
问:可是我这个实体类,没有实现序列化那个接口,也能存到数据库,这是为什么呢?
想不通!我是用的注解和hibernate框架弄的!
难道说不实现序列化接口也能保存数据?不应该啊。
@Entity
public class Person {
@Id @GeneratedValue
private Integer id;
private String name;
private Integer age;
}
答:你用habernate保存数据,只要XML文件配置好了,实体类DAO层都没错,调用SAVE方法 然后COMMIT就可以保存数据。
序列化主要就是把你要保存的数据,转换成字节码的形式,反序列化就是把字节码变成数据。
你直接把数据通过本机服务器提交给硬盘,确实不需要序列化。
但是你在网络传输的时候就不行了,你传给别人一个东西,它接收了所有的字节码之后,却不知道你原本传的是什么对象,也就没法把这个东西按照原始去解析。
你序列化之后,在传给对方,他接收到的时候会按照序列化特定的模式,给反序列化出来,也就是说你传了什么,对方接收的也是什么,解析成功,可以正确使用方法以及属性。
追问:你没明白我的意思,我不是问什么叫序列化
我问你我没实现序列化接口Serializable
为什么还可以保存对象到数据库呢?
追答:本来就是可以保存的啊。你想想最开始学习数据库和JAVA的时候,我们直接写类,写保存方法,然后连接数据库,保存数据,当时的对象属性,不也是没有序列化就直接保存的吗。
实体类只是表的抽象形式而已。理所当然可以保存啊。
保存数据 本来就和序列化没有关系。。。
连接数据库,调用保存方法,没有异常直接提交,然后关闭连接,无论你用hibernate还是以前的,或者SSH框架,都是一个道理。 提交数据只是事物在没有发生异常的时候,成功把JAVA里模拟的数据根据对应的表字段存储到表中。 它和序列化,没有一点关系。
追问:就是说 实体类保存的只是各个属性的字段到数据库。所以不需要序列化
而且也没有对象参与其中,所以实体类和数据库之间的操作不实现Serializable接口也可以
也就是说保存到数据库的不是对象!而是数值数据而已
追答:你这个问题问的好,其实我前面已经说过了。。。
保存本身只是保存数据,但是你有了序列化,就是按照一定标准,方式去保存。
追问:现在明白了,我把单纯的保存数据和保存对象搞混了
那是不是可以这么理解
比如 单纯的数据: 你好
保存对象: 张三 你好(假设张三是对象)
也就是说保存对象,就是多了一个对象+所有属性字段
而单纯保存数据,就是只保存所有属性字段
追答:这个说法也不是很正确。 所谓的保存对象,换句话说无法实现。。。本来保存的就是数据。
对象是什么?是内存地址中分配出来的一块区域,里面有堆和栈的。。分别用来记录对象,类,属性这些东西。但是它只是一个临时的存储空间,你想啊,内存区域划分的空间。对吧。
对象是无法保存的,保存的只是对象里对应字段的数据,因为实体类本身就是表字段的抽象而已。
序列化你记住,就是单纯的一种保存数据的模式。。有了它,在网络传输中安全,而且百分百解析。
追问:这样啊,那对象不能保存的话,但是可以模拟记录下这个吧,比如不是有个序列化uid那个嘛
那个标志是不是就代表这个对象,按你说的对象没法保存,但是我可以自己生成一个id标记,
这样就能把所有字段和属性都归到这个标记下面,然后通过网络传输到另一边。那边收到后
对比id标记,发现是一样的,然后开始恢复所有的属性,成功的保存传输了对象!
追答:你的表中有标识列对吧,hibernate配置的XML文档,本来就对标识列和实体类对应标识列的字段有处理的啊,你保存下来肯定也是对应的呀。
至于保存的是什么,我应该是说错了,保存的确实是对象。具体说是保存了对象中封装的字段,不过书上说的是保存了对象。。
追问:你误会了 我现在说的不是数据库的对应标识了
我说的是保存对象的标识
你应该知道实现Serializable接口后,不是都有一个uid嘛
加上你刚才说的对象只是一个临时内存地址,不能保存不是吗
所以我们自己创造一个uid标识这个对象,不就能保存对象了嘛
我是问的uid是不是这个意思,现在不说数据库的事了,就是传输对象
追答:这个我还真不好回答你了。
序列化某个类的时候,下面不是出现个黄色提示吗,我直接点它,然后就出来这个uid了,以及对应的数值,具体什么作用,这个不清楚了。
追问:看来越往底层就越深奥了。但我感觉应该就是和你说的那个对象没法保存有关系。你想对象没法保存,那靠什么来标识对象,总要有个标记对吧?于是jvm自动根据哈希值生产一个uid,通过网络传输到对方去,对方那边接收到uid后,会和本地的对象uid对比,只要不吻合,就会反序列化对象更新数据。软件的版本更新都这么弄的,只要uid相同证明没改动,uid不一样,就证明有新版本可以更新的
追答:晕呀,我感觉不要追的这么深吧,其实到这个层面就不是我们该学习的了。
它每次更新也好,其中什么微小的改动,都是符合SUN公司设计的体系的,就是JAVA整个体系架构
我们作为程序员,不用去看到如此深层的东西呀!
不过反观这个UID,也许你的猜测是对的吧,它有可能是通过这种方式来校正的,算是排除法吧。
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号<情系IT>,每日技术推送文章供大家学习参考。
你真的了解java序列化吗的更多相关文章
- 关于Java序列化的问题你真的会吗?
引言 在持久化数据对象的时候我们很少使用Java序列化,而是使用数据库等方式来实现.但是在我看来,Java 序列化是一个很重要的内容,序列化不仅可以保存对象到磁盘进行持久化,还可以通过网络传输.在平时 ...
- 【总结】你所不知道的Java序列化
我们都知道,Java序列化可以让我们记录下运行时的对象状态(对象实例域的值),也就是我们经常说的对象持久化 .这个过程其实是非常复杂的,这里我们就好好理解一下Java的对象序列化. 1. 首先我们要搞 ...
- Java 序列化 序列化与单例模式 [ 转载 ]
Java 序列化 序列化与单例模式 [ 转载 ] @author Hollis 本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏. 单例模式,是设计 ...
- Java 序列化 transient关键字
Java 序列化 transient关键字 @author 敏敏Alexia 转自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. tra ...
- Java序列化系列教程(下)
一引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口 ...
- 再来认识一下 Java 序列化
前言 在面试中,Java 序列化被问到的几率还是挺高的.所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解. 序列化基础知识 什么是序列化? Java 序列化是 JDK 1.1 ...
- Java 序列化与反序列化
1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- java序列化
什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机 ...
随机推荐
- Mac配置环境变量path
查看当前配置的path有哪些: 1. echo $PATH 当前所有的 2. cat /etc/paths 这个文件是操作系统自带的 mac系统环境变量的加载顺序(优先级): /etc/profi ...
- 前端面试题——html与css基础篇
整理一波html和css的面试题,侧重基础,希望明天面试能用到~(╥╯^╰╥) 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.C ...
- Git很麻烦?不存在的!掌握这几招就够了
废话不多说,下面直接开始了! 查看原文 确保代码库是最新的,先用这条命令把你的代码拉取到本地 git clone -- 修改完代码后,按顺序执行下面四个命令 git pull git add * /r ...
- Linux——基本命令
目录 一.目录切换命令 二.目录操作命令(增删改查) 2.1增加目录 2.2查看目录 2.3寻找目录(搜索) 2.4修改目录名称 2.5移动目录位置(剪切) 2.6拷贝目录 2.7删除目录 三.文件的 ...
- TCP三次握手和四次握手全过程 为什么要三次握手而不是二次握手?
三次握手 第一次握手: 客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送 ...
- 搭建docker+swoole+php7 的环境
最近在学习swoole php扩展,苦恼于其运行环境不能在win系统下运行, 但开发代码一直在win系统上,很无奈,,,, 所以就用docker来代替,舒服~ 有很多相关docker的swoole镜像 ...
- PCIE DMA实现
基于Spartan-6, Virtex-5/Virtex-6/Virtex-7/7 Series FPGA PCI Express Block Endpoint模块设计PCI Express Endp ...
- github基本使用---从零开始
1.使用之前首先得有账号(附链接):https://github.com/ 2.注册帐号之后得有方便上传项目的工具git bash下载安装 https://gitforwindows.org/ 3.启 ...
- .NET GC垃圾回收器
GC垃圾回收器简介 全名: Garbage Collector 原理: 以应用程序的根(root)为基础,遍历应用程序堆(heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡 ...
- 1002. 写出这个数 (20)-PAT乙级真题
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字.输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每一 ...