对Java Serializable(序列化)的理解和总结(一)_weixin_33862041的博客-程序员秘密

导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型。但是由于map每次都要匹配key值,很麻烦。所以在之后就将参数传递和返回类型全都改成了实体bean,并且让每个bean都实现了Serializable接口。然后,在这里的时候,就有点疑惑。首先:为什么要进行序列化;其次:每个实体bean都必须实现serializabel接口吗?最后:我做一些项目的时候,没有实现序列化,同样没什么影响,然后现在做项目需要序列化,到底什么时候应该进行序列化操作呢?

本篇文章,是我对于序列化这个话题的一点小小的思考,可能还不太成熟,请每一个路过的人不吝赐教,在此,先谢过了!

一、什么是序列化

In computer science, in the context of data storage, serialization is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer, or transmitted across a network connection link) and reconstructed later in the same or another computer environment.[1] When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object.

那我也有看过很多的博客包括书,但是我之前其实一直不太理解这个序列化,虽然一直都在用。今天在看资料 的时候,发现导致这种现象的原因,可能是我之前看的一些介绍里面,忽略了一个很关键的因素:object state info对象的状态信息 。也就是说,其实序列化,它是完整的保存了某一状态下的对象信息,是一个整体,而不是零散的!我在一个IBM工程师的博客里面看到一个说法,我感觉对于我理解序列化很有帮助,他说序列化的过程,就是一个“freeze”的过程,它将一个对象freeze住,然后进行存储,等到再次需要的时候,再将这个对象de-freeze就可以立即使用。


二、为什么需要序列化

1,存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。也就是When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object.

问题:我没有实现序列化的时候,我一样可以存入到我的sqlserver或者MySQL、Oracle数据库中啊,为什么一定要序列化才能存储呢????

2,便于数据传输,尤其是在远程调用的时候!


三、到底什么时候一定要序列化

结合到第二点的问题,就是说在我存储的时候,不通过序列化也一样完美存储,为什么要多此一举?额,经过我阅读文档和书籍,以及做项目的经验总结(反正就是之前混迹在编码中的一系列经验总结),在存储时需要序列化,这是肯定的。大家知道的是序列化是将对象进行流化存储,我们有时候感觉自己在项目中并没有进行序列化操作,也一样是存进去了,那么对象需要经过序列化才能存储的说法,似乎从这儿就给阉割了。事实究竟是怎样的呢?

首先看我们常用的数据类型类声明:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

public class Date implements java.io.Serializable, Cloneable, Comparable
而像其他int、long、boolean类型等,都是基本数据类型,数据库里面有与之对应的数据结构。从上面的类声明来看,我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。

拿到这儿的时候,就又有一个问题,既然实体类的变量都已经帮助我们实现了序列化,为什么我们仍然要显示的让类实现serializable接口呢?

请注意我以上的说法:首先,序列化的目的有两个,第一个是便于存储,第二个是便于传输。我们一般的实体类不需要程序员再次实现序列化的时候,请想两个问题:第一:存储媒体里面,是否是有其相对应的数据结构?第二:这个实体类,是否需要远程传输(或者两个不同系统甚至是分布式模块之间的调用)?

如果有注意观察的话,发现序列化操作用于存储时,一般是对于NoSql数据库,而在使用Nosql数据库进行存储时,用“freeze”这个说法来理解是再恰当不过了,请在NoSql数据库中,给我找出个varchar,int之类的数据结构出来? 如果没有,但我们又确实需要进行存储,那么,此时程序员再不将对象进行序列化,更待何时?

备注:如果有人打开过Serializable接口的源码,就会发现,这个接口其实是个空接口,那么这个序列化操作,到底是由谁去实现了呢?其实,看一下接口的注释说明就知道,当我们让实体类实现Serializable接口时,其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化。

然后,需要说明的是,当我们在实体类声明实现Serializable接口时,再次进行观察,会发现这些类是需要被远程调用的。也就是说需要或者可能需要被远程调用,这就是序列化便于传输的用途。

慎重声明:以上所有言论,都是本宝宝经过项目中的具体观察,以及阅读一些文章之后的所谓经验之谈,且看且见谅吧!


三、是否一定要实现Serializable接口序列化

上回说到了关于序列化的一些基本情况,那么,接下来的一个问题是:如果我们要实现序列化操作,是否一定要通过实现Serializable接口的方式?PS:其实,我只是不明白,为什么大家一提到序列化就说特别简单,实现Serializable接口就OK了?我就一直在想,这是否是目前我们所能拥有的最佳选择?

请大家先看一篇文章分析:https://github.com/eishay/jvm-serializers/wiki

文章说得很清楚,图文并茂的,那么多选择,自己看着办吧。不过我最近做的一个项目使用的是protostuff!


四、使用其他序列化实现的优缺点

诚如大家在第三节分享的链接文章所见,通过实现Serializable接口的方式去进行序列化操作,在性能上来讲并不是最佳选择。那么,在性能考虑的情况下,很多人都会选择其他更为高效率的产品替代serializable接口,现在问题来了:

1,如果我通过Serializable接口实现,那么我只需要在类声明时实现它即可

2,如果我通过其他方式实现,那么我将不得不自己重写工具类,不能再通过实现serializable接口的方式去进行序列化了。在使用上,大大的不怎么方便!

PS:项目中总会用到个什么redis,mongoDB啥的,其实每次存取都有那么一个数据封装处理的过程,额,也差不了这一点了。那么有没有现成的人家封装好的呢?自己找吧,肯定是有的。其实,我就是不明白,如果是用了第三方的工具去实现序列化,那么在序列化进行远程调用的时候,到底应该在哪儿进行显示的序列化或者反序列操作?我刚开始想在Dao层,但这样子的话,自己模块操作不也得来那么一波序列化反序列化操作嘛。因为我目前确实只是在从NoSql数据库中存取数据时用到了第三方的序列化工具,而在远程调用的时候,没有啊!以前都是直接实现Serializable接口的,唉。。。。学艺不精啊!

跪求指点!!!!!


五、总结

其实,很长的一段时间里,我一直以为java底层包自带的方法一定会是最好的,包括各个框架,我都更愿意去用它本身就有的工具。但是,可能那些自带的方法,尤其是向Serializable接口,从jdk1.1开始就有了,经过了长时间的考验,性能上可能不是最好的,但它的稳定性绝对是值得肯定的。那么,其实在使用的时候,还是根据自身的情况考虑吧。在技术乃至于架构或者说各种系统设计,最实用最适合的,才是最好了!

其实我还有一个问题,不见得自己模块会和数据库部署到同一个机器上啊,所以还是得考虑都传输时的序列化问题,那如果使用第三方的工具,不都得来那么一波嘛,这代码量就又活生生的多了那么点儿。唉,不说了,我这是越说越晕,回家吃饭!



转载于:https://www.cnblogs.com/zhuhui-site/p/10090967.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33862041/article/details/94760604

智能推荐

python 热键功能_pyhotkey_lsjweiyi的博客-程序员秘密

偶然间发现一篇大牛的博客,里面写了完整的热键功能实现,地址是: http://eyehere.net/2012/%e7%94%a8python%e5%88%b6%e4%bd%9c%e6%b8%b8%e6%88%8f%e5%a4%96%e6%8c%82%ef%bc%88%e4%b8%8b%ef%bc%89/感觉以后会用上,先存一下。

springboot-mybatis(关联关系:一对一,一对多,多对多)_speingboot一对一 多对多在mybatis层_mage码钟的博客-程序员秘密

mybatis(关联关系:一对一,一对多,多对多)做项目的时候,总少不了关联关系,,但也有很多同学没弄明白关联关系到底是什么?怎么用?这东西几乎是后端必备的内容,现在还不会?没关系,谁说IT工程师刚出来就什么都会呢?有时候现学现卖也是本事。进入主题:一对一一对一是什么意思?虽然字短,但不难看出就是一对一嘛,哈哈哈哈哈见笑了,所谓的一对一也就是指某个单一的事物与另一件单一的事物的关系(描述不是很准确,但至少有其中之一必须是单一的,且是单一或N多的一方指向单一的一方),打个比方:一个学生只有一个班

Xshell连接不上阿里云报错:connection failed的解决方案_林猛男的博客-程序员秘密

问题:Xshell连接不上阿里云服务器,报错如下 解决方案: 1、登录阿里云服务器,配置公网出入配置22端口(出入网都需要如下配置) 2、浏览器访问http://ip.taobao.com , 查询自己本地的公网ip 3、将本地公网ip配置在阿里云服务器的白名单中 4、xshell再次连接,成功如图所示 end、、、、、、

Spring Data Jpa 保存实体返回主键_jpa保存后会把主键反写吗_范学博的博客-程序员秘密

直接上图实体类中get和set方法就正常就好了,看有的博客说一定要加在get方法上,保留意见,因为项目架构不同。注意实体类上,我注掉的代码,一定要去掉,加上了会报错。当然你的项目没有用到就不用管了。为确保严谨,发下项目架构spring boot + spring data jpa,服务搭建spring cloud代码实测,真实有效,铁证如山,一直被模仿,从...

matlab怎么停止运行命令,MATLAB如何使用pause函数暂停程序运行_Li Siyuan的博客-程序员秘密

MATLAB如何使用pause函数暂停程序运行【语法说明】oldstate=pause(newsyaye):pause函数用于暂停程序运行,这一功能是可以被关闭的。newstate和oldstate均为字符串,取值只能为on或off。这条命令将pause函数的暂停功能设置为打开或关闭,并返回设置前的状态。当状态为off时,即使程序中出现了pause语句,也会被忽略,不会发生暂停或延时。pause ...

技巧:在Silverlight 2应用程序中切换用户控件_weixin_30955341的博客-程序员秘密

摘要大家都知道,在Silverlight 2应用程序中,每个应用程序将生成一个xap文件,每一个xap文件中只能设置一个起始的用户控件。如果我们有多个用户控件,需要在不同的ASP.NET页面中加载,最简单的方法莫过于针对多个用户控件分别建立对应的Silverlight项目,但这种方式有很多的缺点,如我们的样式文件需要在多个项目中进行拷贝。本文将介绍利用初始化参数进行用户控件的切换这一技巧。...

随便推点

PostgreSQL的数据类型及日常实践笔记_pg hextoraw_Murkey学习之旅的博客-程序员秘密

PostgreSQL常用数据类型及实践数据类型是编程语言中,在其数据结构上定义的相同值类型的集合以及对该相同值集合的一组操作。而数据类型的值存储离不开变量,因此变量的一个作用就是使用它来存储相同值集的数据类型。数据类型决定了如何将代表这些值的集合存储在计算机的内存中。变量一般遵循先声明后使用的原则。而在数据库中,变量就是字段,用字段来表示一组相同值类型的集合,其实也是先声明后使用的原则。PostgreSQL支持丰富的数据类型,包括一般的数据类型和非常规的数据类型。一般数据类型包括数值型,货币类型,字符类

路由事件自动打开页面_quanSIR123的博客-程序员秘密

流程:测试产品-&gt;打开页面(不测试直接打开页面不会显示数据)以下是代码我写的页面的名字是ConsumablesConfigWindow.xaml最后在需要打开页面的地方写上就可以自动打开ConsumablesConfigWindow.xaml页面了...

函数系列_fgh,07_fgh431的博客-程序员秘密

文章目录导数系列 x∈Ix\in Ix∈If(x)f(x)f(x)值域为(5,7](5,7](5,7]a+f(x)&lt;a2+7a+f(x)&lt;a^2+7a+f(x)&lt;a2+7恒成立求aaa的范围!导数系列f(x)f(x)f(x)在R↑R\uparrowR↑则说明啥?

谷歌分布式计算框架MapReduce论文2004 中文翻译_mapreduce出现04年_Cloveryww的博客-程序员秘密

MapReduce:超大机群上的简单数据处理                                           摘要MapReduce是一个编程模型,和处理,产生大数据集的相关实现.用户指定一个map函数处理一个key/value对,从而产生中间的key/value对集.然后再指定一个reduce函数合并所有的具有相同中间key的中间value.下面将列举

什么是mixin,为什么它们有用?_clash mixin_p15097962069的博客-程序员秘密

在“ Python编程 ”中,Mark Lutz提到了“ mixins”。 我来自C / C ++ / C#背景,以前没有听说过这个词。 什么是mixin? 在本示例的两行之间进行阅读(

推荐文章

热门文章

相关标签