Serializable 序列化[基于java]

前言:最近接触的技术慢慢增多,也写了一些方便的技术文档。苦于排版不够系统,干脆对Deepseek提了一些要求,让它重塑我写的这些文档。效果还不错,也拓展了一些还不够了解的知识。因此之后的技术分享很可能以这种形式出现,我自己读着还不错,请多提提意见!

这是我向Deepseek提问的模版:

  • 第一:不说废话,直抒胸臆;
  • 第二:能够给快速上手的人们快速开始的机会,比如多给命令行,支持复制粘贴;
  • 第三:有深度,能够结合实战开发,最好多一些实例;
  • 最后:如果能够引发人们思考更好。

0x00 基础知识(2分钟)

一句话理解:序列化就像把乐高玩具打包成盒子,反序列化就是拆开盒子恢复原样

  • 序列化->具体(对象->数据) 序列化用于将抽象数据转化为网络传输/存储形式(JSON/XML/二进制)
  • 反序列化->抽象(数据->对象) 反序列化主要是将数据抽象,便于业务逻辑处理

传播路径:[数据库] → 反序列化 → [程序处理(业务逻辑)] → 序列化 → [网络传输]

0x01 快速使用(5分钟)

 import java.io.*;
 ​
 // 第一步:实现Serializable接口(空接口)
 class User implements Serializable {  // [!code focus]
 // 第二步:添加版本号
     private static final long serialVersionUID = 1L;  // [!code focus]
     
     private String name;
     private transient String password; // transient不参与序列化
 }
 ​
 // 第三步:序列化对象
 try (ObjectOutputStream out = new ObjectOutputStream(
         new FileOutputStream("user.data"))) {  // [!code focus]
     out.writeObject(new User("张三", "123456"));
 }
 ​
 // 第四步:反序列化
 try (ObjectInputStream in = new ObjectInputStream(
         new FileInputStream("user.data"))) {
     User user = (User) in.readObject();  // [!code focus]
     System.out.println(user.getName()); // 输出"张三"
     System.out.println(user.getPassword()); // 输出null(因为transient)
 }

0x02 核心记忆点

✔️ 建议做

• 给每个类添加serialVersionUID (IDE可自动生成:Alt+Enter → Add serialVersionUID) • 敏感字段用transient修饰

❌ 不要做

• 序列化大对象(超过1MB要考虑其他方案) • 修改已序列化类的字段类型(会报错!)

💡 场景联想

 [数据库] → 反序列化 → [程序处理] → 序列化 → [网络传输]

0x03 常见问题

  1. 检查serialVersionUID是否一致
  2. 确认字段类型没有修改
  3. 删除旧的序列化文件重新生成

症状:反序列化后数据不对

• 检查是否有字段漏加transient • 验证序列化/反序列化代码顺序一致

0x04 新手实验室

实验1:修改serialVersionUID

 - private static final long serialVersionUID = 1L;
 + private static final long serialVersionUID = 2L;

观察反序列化时的报错信息

实验2:移除transient

 - private transient String password;
 + private String password;

查看反序列化后的密码值

0x05 未来升级入口(我将后续补充)

进阶预备区

• 高性能方案 → Protobuf • 安全方案 → 白名单校验 • 分布式方案 → 版本兼容策略

当前进度:🟢 基础掌握(可进行项目开发)

过年到春分期间,看到了很多科技创新的故事。我开始思考我的价值观,我所处的环境,我的能力,可以做成什么样的事。我看到过去90年代马云推崇自己思想时的不顾一切,看到《硅谷之火》中科技工作者开发产品时的废寝忘食,看到Deepseek的自我介绍中写着“不做中庸的事,带着好奇心,用最长期的眼光去回答最大的问题”。再想想自己一直不走出去,沉迷在所谓的学习中,没有压力,没有饥饿感,顶多是三天打鱼两天晒网。时候已经不晚了,码头上停着船。接下来要做的,不是刻意地把java,web等等技术做成学习计划,而是大胆出去,在真实的实践中不断解决问题,不断丰富技术。我会洗干净头发爬上桅杆,撑起这艘小船的。

如何快速上手宝塔面板?

近期配了台服务器,但还没有系统尝试过Linux系统中的复杂部署,更不懂得运维,甚至连远程SSH连接都极少使用。本文将会以快速上手为目的,使用宝塔面板完成第一次服务器部署。

注意:安装宝塔面板前请确保服务器是全新的!此处服务器页面演示以阿里云为例,其余厂商名词基本相同,照着提示词做即可,无需追求页面一致。

  • 1.在云服务器厂商中获取服务器的公网IP(不用关闭网页,后面还会用到)
  • 2.修改服务器的密码,为自己所知
  • 3.打开云服务器页面,在左侧边栏找到安全组并点击进入(不用关闭网页,后面还会用到)
  • 4.打开宝塔网址,根据自己的系统(Linux/Windows)选择对应产品
  • 5.选择对应产品后,可能会被指引到此处
  • 6.不用急着操作,我们选择更加快捷的在线安装。你只需要继续往下滑动鼠标,就会看到:
  • 7.接下来,回到第一步的网站,把公网IP复制粘贴进来在线安装界面,并使用自己第二步设置好的密码。做到这里,请不要点击立即安装
  • 8.回到第三步的网站,点击管理规则
  • 9.开放两个端口:
    22–用于SSH连接
    8888–用于宝塔面板
    详细操作:
    在目的后填写端口号:22,源选择所有IPV4,然后保存。
    同样步骤,在目的后填写端口号8888端口,源选择所有IPV4,保存。
  • 10.回到第七步,可以点击立即安装。若需要注册宝塔账号则跟着注册即可。
  • 11.服务器端已经下载了宝塔面板,你可以通过[IP地址]:[端口号(一般就是8888)]进行访问,比如192.168.0.1:8888
    现在你已成功安装宝塔面板!

世界,你好

大一,第一次敲下‘printf(“Hello,world!”);’的时候,有点不屑,以为做程序几乎不会用到如此的语句。而当我终于开通了个人小站,正襟危坐在电脑前编辑第一篇博客,却想不出更好的语句来代表此刻。互联网下,众生平等。实际上现在已经很少因为程序成功运行而感到如释重负或是欣喜若狂了,但越细想着文字、图片、音频、视频通过层层封装,封装成一个“发布”按钮被点击后,即能够全球可见,不禁向互联网致敬。

创立本站的原因很多,一是可以记录,二是能够分享,三是养成习惯。学习计算机的这一年半里,体会到一套普世的逻辑:输入->处理->输出。有时候输入很盲目,很沉迷,往往一头扎进去,结果是几天没用就忘了。知识跑不出全流程的话,只能在多次的失去、重拾中成为经验,很花时间。为了知识能够输出,我想在多使用的基础上,再多记录。曾经在网站上写一些很粗糙的技术帖,虽然能帮助到小部分急需快速上手的朋友,但总无法坚持。写在本地的也很多:日记、念头、计划,又没有公开的必要。如今在互联网上有了自己的域名,也算是有了个租了五年的电子小家,自然不能随意糟蹋,希望能够恢复往日的输出。

建站的计划从去年就在想,本想着自己搭一个前后端,可惜学习不够认真,技术落后于需求。这也是我要改进的地方:做事情要专心,不要因为不在“主线任务”里就敷衍了事。也许在以后这个计划会被实现,现在让我们用WordPress。这个系统支持读者发评论,搜索文章,欢迎每一个访客的留言。当前的网站结构延续着我去年的计划:技术/念头/行迹/灯塔。

  • 技术:写写每日的所做所学,专业知识涉及得比较多,我会尽可能写得浅显易懂,这不仅是分享给有缘的每一位访客,也是在写给遗忘后的自己。
  • 念头:我的想法,浮在空中,或许落地
  • 行迹:去过的一些地方,有点像游记。听说年轻时去过的地方,会一直让回忆价值复利。
  • 灯塔:曾指引我或一直指引我的东西。歌、书、电影、网站、等等。权当分享。

我喜欢找一个特别的节点来开始做一个长期的事情。今天是周一,因此xkai.site开始了。

世界,你好