电话
400 9058 355
序列化是将内存中对象的状态转换为字节流以持久化或传输,反序列化则还原对象;必须实现Serializable接口标记允许序列化,子类继承时建议显式实现,非transient非static字段须可序列化,serialVersionUID需手动维护确保兼容性。
Java对象只活在JVM堆内存里,程序一关,对象就灰飞烟灭。序列化干的就是这件事:把对象当前的字段值(状态)打包成一串字节,写进文件、数据库,或发到网络另一端。反序列化则是拿这串字节“洗印”出一模一样的对象——不是新new的,而是状态完全还原的副本。
Serializable 接口?它是个空接口(marker interface),不强制你写任何方法,纯

ObjectOutputStream.writeObject() 会直接抛 NotSerializableException。
Serializable,也能序列化——但强烈建议自己也加上,避免歧义Serializable,子类实现了,那父类的字段在序列化时会被跳过(反序列化时用默认值初始化)transient、非 static 的成员变量,都必须是可序列化的类型;否则会报 NotSerializableException(比如你字段是 java.util.Date 没问题,但如果是自定义类却没实现 Serializable,就挂了)serialVersionUID 不是可选的,它是兼容性守门员每次类结构变化(增删字段、改访问修饰符、调整继承关系),如果没手动更新 serialVersionUID,反序列化旧数据时大概率抛 InvalidClassException: local class incompatible。
private static final long serialVersionUID = 1L;
-3186721026267206914L)用 ObjectOutputStream 写文件看似简单,但实际落地常踩雷:
AC ED 和版本号),不能用文本编辑器打开,也不能用 String 或 JSON 工具解析writeObject(),默认只写一次完整数据,后几次只写引用句柄——想真正重复保存状态,得调用 oos.reset()
transient 字段不会被序列化,反序列化后为默认值(int 是 0,Object 是 null);若需自定义逻辑(比如加密/懒加载),得配合 writeObject() / readObject() 私有方法Thread、Socket、Connection 这类与JVM运行时强绑定的资源对象序列化——它们根本没法还原真正做持久化时,优先考虑 JSON/YAML/Protobuf 等跨语言、可读、易调试的格式;JDK原生序列化只适合内部模块间短生命周期的数据传递,或者RMI这类紧耦合场景。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...