当前位置: 首页 > news >正文

关于面试被面试官暴怼:“几年研究生白读” 的前因后果

    中午一个网友来信说自己和面试官干起来了,看完他的描述真是苦笑不得,这年头是怎么了,最近互联网CS消息满天飞,怎么连面试官都SB起来了呢?

    大概是这样的:这位网友面试时被问及了Serializable接口的底层实现原理,因为这是一个标识性的空接口,大部分同学在学习时都秉持着会用就行(说实话,Build哥在这之前也没怎么细研究过,都是拿来就用),几乎不太去关注底层的东西,这位网友亦是如此,在这种情况下,自然回答的心虚,这下可被面试官抓住了把柄,一顿带有人身攻击的狂输出,让面试现场变成了撕B现场,具体可看聊天截图😂😂😂

在这里插入图片描述

    基于这位网友的面试经历,Build哥又赶紧去重新学了一下Serializable关键字,以及它背后的实现,别到时候咱也被暴怼,下面咱们一起来重温一下。

一、序列化与反序列化

首先,我们先来了解一下两个概念 序列化反序列化

  • 序列化: 将Java对象转换为一个字节序列(包含对象的数据、对象的类型和对象中存储的属性等信息)的过程,以便于在网络上传输或者存储在文件中。
  • 反序列化: 是序列化的逆过程,将字节序列转为Java对象的过程。

1.1 序列化与反序列化的应用场景

  • 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  • 将对象存储到文件(如系统中excle的上传与下载)之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
  • 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
  • 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。

序列化与发序列化的流转过程可参考下图:
在这里插入图片描述
有个问题,如果在我的对象中,有些变量并不想被序列化应该怎么办呢?

答:不想被序列化的变量我们可以使用transientstatic关键字修饰;transient 关键字的作用是阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复;而static关键字修饰的变量并不属于对象本身,所以也同样不会被序列化!具体原因,我们在后面会解释,继续往下看。

二、Java中的序列流

    为了探讨Java对象序列化与反序列化的过程,以及Serializable关键字在整个过程中的作用,我们先来提一个 序列流 的概念,刚好我们最近也在写关于Java IO的相关博客。

    Java 的序列流(ObjectInputStream 和 ObjectOutputStream)是一种可以将 Java 对象序列化和反序列化的流。这个属于基本的字节输入流与输出流的演变,之前的博文中已经介绍了它们的用法,在这里就不再展开了。

  • ObjectOutputStream:将序列化后的字节序列写入到文件、网络等输出流中。
  • ObjectInputStream:可以读取 ObjectOutputStream 写入的字节流,并将其反序列化为相应的对象(包含对象的数据、对象的类型和对象中存储的属性等信息)。

三、序列化实战

    OK,有了上面两个理论知识作为铺垫,我们接下来就可以进行序列化的实战了,首先,我们要先创建一个包含简单属性的类,这里我们创建了一个Person类,里面有name和age两个属性字段。然后,我们通过ObjectOutputStream流将对象写出到文件(序列化),然后再通过ObjectInputStream读取文件中的数据,输出为一个person对象(反序列化)。

话不多说,直接上代码:

public class Test {public static void main(String[] args) throws IOException {//初始化对象信息Person person = 

相关文章:

  • React获取DOM节点
  • 【Android】基于webView打造富文本编辑器(H5)
  • 网络故障排查-TCP标志位
  • VB.net调用VC DLL(二)
  • AD域离线破解新思路:Trustroasting和TimeRoasting
  • HTML(13)——显示模式
  • 渗透测试基础(四) MS08-067 漏洞攻击
  • InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)
  • KEYSIGHT是德E5063A网络分析仪
  • 网络编程面试题
  • 企业PC端官网在线客服源码系统 完全开源可二开 附带源代码包+搭建部署教程
  • ABB机器人SMB板卡的安装及更换方法
  • AI视频智能监管赋能城市管理:打造安全有序的城市环境
  • 关于BERT和embedding
  • MacBook Air M3的电脑怎么样 新买MacBook Air提示内存不足 苹果电脑内存不够用怎么办
  • Brief introduction of how to 'Call, Apply and Bind'
  • chrome扩展demo1-小时钟
  • gcc介绍及安装
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JS笔记四:作用域、变量(函数)提升
  • MD5加密原理解析及OC版原理实现
  • nodejs实现webservice问题总结
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Boot快速入门(一):Hello Spring Boot
  • 后端_MYSQL
  • 中文输入法与React文本输入框的问题与解决方案
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 数仓建模:如何构建主题宽表模型?
  • $L^p$ 调和函数恒为零
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)linux使用docker容器运行mysql
  • (二)springcloud实战之config配置中心
  • (二十四)Flask之flask-session组件
  • (南京观海微电子)——I3C协议介绍
  • (万字长文)Spring的核心知识尽揽其中
  • (转)创业的注意事项
  • (转)关于pipe()的详细解析
  • .gitignore文件—git忽略文件
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net 应用中使用dot trace进行性能诊断
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • @ConditionalOnProperty注解使用说明
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [1525]字符统计2 (哈希)SDUT
  • [bzoj1912]异象石(set)
  • [CakePHP] 在Controller中使用Helper
  • [CISCN2019 华东北赛区]Web2