首页 > 其他分享 >实体类为啥要序列化

实体类为啥要序列化

时间:2024-06-05 15:22:50浏览次数:32  
标签:实体类 对象 为啥 接口 实现 序列化 Serializable


 

实体类实现Serializable的作用

作用:第一个是便于存储,第二个是便于传输

Serializable,之前一直有使用,默认的实体类就会实现Serializable接口,对具体原因一直不是很了解,同时如果没有实现序列化,同样没什么影响,什么时候应该进行序列化操作呢?今天查了下资料,大致总结一下。

1、其实序列化,它是完整的保存了某一状态下的对象信息,是一个整体,而不是零散的!我在一个IBM工程师的博客里面看到一个说法,我感觉对于我理解序列化很有帮助,他说序列化的过程,就是一个“freeze(冻结)”的过程,它将一个对象freeze住,然后进行存储,等到再次需要的时候,再将这个对象de-freeze就可以立即使用。

2、而像int、long、boolean类型等,都是基本数据类型,数据库里面有与之对应的数据结构。从类声明来看,我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。所以就算我们不实现serializable依旧可以正常操作。

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

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

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

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

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

2,什么情况下会用到序列化?

 

     1,当你想把内存中的对象写入到硬盘时

     2,当你想用套接字在网络上传输对象时

     3,当你想通过RMI调用对象时

    (RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。

 

3,序列化需要注意的事项

     1,序列化只保存对象的状态,而不管对象的方法。

     2,当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。

     3,当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。

 

  本人新手,肯定有理解错误的地方,还请大家不吝赐教,多多给予批评指正!  
      万般感谢!!!          

转自>https://www.cnblogs.com/jap6/p/10552646.html

标签:实体类,对象,为啥,接口,实现,序列化,Serializable
From: https://www.cnblogs.com/xzboke/p/18233106

相关文章

  • android gson 扩展, 序列化int类型被转double 问题
    importcom.google.gson.Gsonimportcom.google.gson.GsonBuilderimportcom.google.gson.ToNumberStrategyimportcom.google.gson.reflect.TypeTokenimportcom.google.gson.stream.JsonReaderimportjava.io.IOExceptionimportjava.lang.reflect.Typeimportjava.m......
  • .Net项目快速生成数据库的实体类
    MySQL数据库在NuGet包管理中安装以下包,选择符合项目.Net版本的包Microsoft.EntityFrameworkCore.ToolsMicrosoft.EntityFrameworkCore.DesignMySql.EntityFrameworkCore 在程序包控制管理台执行以下命令Scaffold-DbContext"DataSource=localhost;InitialCatalog=mydb;......
  • 【DRF-10】rest-framework之序列化(数据校验)
    1.自定义classTitleValidator(object):def__init__(self,start):self.start=startdef__call__(self,value):ifnotvalue.startswith(self.start):message='标题必须以%s为开头。'%self.startraiseseria......
  • 【DRF-09】rest-framework之序列化(序列化)
    1.序列化用于对用户请求数据进行验证和数据进行序列化,本篇文章主要讲解序列化部分。1.1:序列化的意义:web有两种应用模式,一种是前后端不分离,一种是前后端分离,当前后端分离的时候,后端只需要向前端传输数据即可,不需要进行其他的操作,而restframework在前后端传输数据时,主要是jso......
  • fastjson反序列化漏洞
    一题Think_java大多数师傅都是用的自己构造的java反序列化来做的。正好当时用fastjson写出来了。近些天也在挖洞,对于很多json传输的数据也会尝试一下fastjson的payload。那就正好一起来看当时如何利用fastjson的,应该是个非预期吧,其实这个虽然说是ctf题目,但环境属实和实战没......
  • 反序列化魔术方法
    魔术方法成员属性变量和成员属性是一个东西__consrtuct构造方法在对象实例化时执行的方法__construct()只会在new一个对象时触发,serialiaze和unserialize都不会触发__destruct()析构函数__destruct()函数只会在序列化serialize()反序列化unserialize()和销毁一个对象时触......
  • phar反序列化例题
    [CISCN2019华北赛区Day1Web1]Dropbox目录穿越下载注册、登录,发现可文件上传。上传文件后发现可以下载或者删除,尝试上传php马但是发现都被过滤,抓包下载的选项。发现下载可能存在目录穿越。于是尝试../../index.php,发现可成功下载。于是将download.phpdelete.php下载,审源码......
  • java动态获取实体类的字段
    1.使用反射(Reflection)API来动态地获取实体类的字段在Java中,我们可以使用反射(Reflection)API来动态地获取实体类的字段。以下是一个详细的代码示例,演示了如何获取一个实体类的所有字段:首先,我们定义一个简单的实体类(EntityClass):publicclassPerson{privateStringname;......
  • 5.17反序列化
    1、原理序列化:对象状态-可存储或传输形式的过程,将状态信息保存为字符串;反序列化:序列化的字符串-对象;恶意代码注入到应用程序中,程序从不安全来源反序列化数据时,数据从一种格式(json、xml)转化为(对象或列表),如果不检查安全性,则攻击者构造恶意代码在数据,程序反序列化时,恶意代码执行......
  • Jackson序列化为字符串时对指定字段脱敏
    枚举脱敏字段类型及规则importjava.util.function.Function;publicenumTextMaskStrategy{ID_NO("身份证",18,text->"*".repeat(text.length()-4)+text.substring(text.length()-4)),PHONE("手机号",11,text->text.substr......