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

阳江做网站详细解读做普通网站公司

阳江做网站详细解读,做普通网站公司,建设电商网站所需硬件,钉钉爱客crmJava 序列化与反序列化终极解析 1. 核心概念 (1) 什么是序列化? 定义:将对象转换为字节流的过程(对象 → 字节) 目的: 持久化存储(如保存到文件) 网络传输(如RPC调用&#xff09…

Java 序列化与反序列化终极解析

1. 核心概念

(1) 什么是序列化?

  • 定义:将对象转换为字节流的过程(对象 → 字节)

  • 目的

    • 持久化存储(如保存到文件)

    • 网络传输(如RPC调用)

    • 深拷贝实现

(2) 什么是反序列化?

  • 定义:将字节流还原为对象的过程(字节 → 对象)

  • 关键点

    • 不会调用构造方法

    • 字段值直接从字节流读取

2. 核心API

(1) 序列化相关类

类/接口作用
Serializable标记接口(无方法)
Externalizable提供自定义序列化(需实现2个方法)
ObjectOutputStream序列化输出流
ObjectInputStream反序列化输入流

(2) 关键方法

java

// 序列化
objectOutputStream.writeObject(obj);// 反序列化
Object obj = objectInputStream.readObject();

3. 完整流程解析

(1) 序列化流程

  1. 检查对象是否实现Serializable

  2. 递归序列化所有非transient字段

  3. 写入类描述信息(含serialVersionUID

  4. 写入字段数据

(2) 反序列化流程

  1. 读取并验证serialVersionUID

  2. 分配对象内存(不调用构造方法)

  3. 递归填充字段值

  4. 对于Externalizable对象,调用readExternal()

4. 代码示例

(1) 基础序列化

java

// 可序列化类
class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private transient int age; // 不参与序列化// 构造方法、getter/setter省略
}// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {oos.writeObject(new Person("Alice", 25));
}// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {Person p = (Person) ois.readObject();System.out.println(p.getName()); // 输出AliceSystem.out.println(p.getAge()); // 输出0(transient字段)
}

(2) 自定义序列化(Externalizable)

java

class Student implements Externalizable {private String name;// 必须有无参构造器public Student() {}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeUTF(name);}@Overridepublic void readExternal(ObjectInput in) throws IOException {this.name = in.readUTF();}
}

5. 关键机制

(1) serialVersionUID

  • 作用:版本控制,防止类结构变更导致反序列化失败

  • 生成方式

    • 显式声明:private static final long serialVersionUID = 1L;

    • 隐式生成:根据类结构计算hash值

(2) 序列化规则

字段类型是否序列化说明
普通实例字段
transient字段如密码字段
static字段属于类而非对象
未实现Serializable抛出异常所有引用字段必须可序列化

6. 高级特性

(1) 自定义序列化

java

private void writeObject(ObjectOutputStream out) throws IOException {out.defaultWriteObject(); // 默认序列化out.writeUTF(encrypt(password)); // 自定义处理
}private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {in.defaultReadObject(); // 默认反序列化this.password = decrypt(in.readUTF()); // 自定义处理
}

(2) 序列化代理模式

java

private Object writeReplace() {return new SerializationProxy(this);
}private static class SerializationProxy implements Serializable {private final String data;SerializationProxy(OriginalClass obj) {this.data = obj.getData();}private Object readResolve() {return new OriginalClass(data);}
}

7. 常见问题与解决方案

(1) 反序列化漏洞

  • 风险:攻击者可能构造恶意字节流执行任意代码

  • 防护

    • 使用ObjectInputFilter设置白名单

    java

ObjectInputFilter filter = info -> info.serialClass() == Person.class ? Status.ALLOWED : Status.REJECTED;
ois.setObjectInputFilter(filter);

(2) 性能优化

  • 替代方案

    • JSON(Jackson/Gson)

    • 二进制协议(Protocol Buffers)

    • Kryo(高性能Java序列化)

8. 记忆技巧

(1) 核心口诀

"序列化要接口,transient能跳过
static不算数,UID保平安
构造方法不执行,字段直接写内存"

(2) 流程图解

复制

序列化:
[对象] → [检查Serializable] → [写入元数据] → [递归写字段] → [字节流]反序列化:
[字节流] → [验证UID] → [分配内存] → [填充字段] → [返回对象]

9. 面试高频问题

  1. Q: 反序列化时如何避免调用构造方法?
    A: JVM直接分配内存并从字节流填充数据

  2. Q: 为什么Serializable是空接口?
    A: 标记接口,仅用于类型检查

  3. Q: 如何实现深拷贝?
    A: 序列化后再反序列化

  4. QExternalizableSerializable区别?
    A: 前者需实现方法,后者自动序列化

10. 最佳实践

  1. 安全性

    • 敏感字段标记transient

    • 使用ObjectInputFilter

  2. 版本控制

    • 始终显式声明serialVersionUID

  3. 性能

    • 避免序列化大对象

    • 考虑替代方案(如ProtoBuf)

  4. 代码健壮性

    • 实现readObject()时保持防御性编程

    • 对不可变对象使用序列化代理模式

通过这个完整体系,你已掌握Java序列化的:
✅ 核心机制 ✅ 安全风险 ✅ 性能优化 ✅ 工程实践


文章转载自:

http://n7JJgvSl.yhjrc.cn
http://dwGTk2fv.yhjrc.cn
http://LeCum8gb.yhjrc.cn
http://0NGyi0cv.yhjrc.cn
http://HnaoUWaf.yhjrc.cn
http://TKzpj1nV.yhjrc.cn
http://1H8gsUFe.yhjrc.cn
http://wt5AwDIQ.yhjrc.cn
http://ZzI6aF48.yhjrc.cn
http://kOc1WPox.yhjrc.cn
http://pkduUumr.yhjrc.cn
http://SDcztCmJ.yhjrc.cn
http://5QSrRBOz.yhjrc.cn
http://uRVnkk1n.yhjrc.cn
http://q2f51Q7R.yhjrc.cn
http://sI8Q5mcV.yhjrc.cn
http://mescsq8e.yhjrc.cn
http://gmQo51nD.yhjrc.cn
http://kdWfeVOC.yhjrc.cn
http://B8Z08Xyu.yhjrc.cn
http://POW3gIQK.yhjrc.cn
http://LAKil8lM.yhjrc.cn
http://goljIE93.yhjrc.cn
http://ZHXJlZrR.yhjrc.cn
http://WF4QKqwG.yhjrc.cn
http://wjZLSswG.yhjrc.cn
http://XuXxci4t.yhjrc.cn
http://15I4BqZn.yhjrc.cn
http://1k8udezN.yhjrc.cn
http://iJG57fOq.yhjrc.cn
http://www.dtcms.com/wzjs/720916.html

相关文章:

  • 公司网站被百度收录深圳企业网站制作报价
  • 网站建设人员工资中国黄金建设网站
  • 建设网站的政策风险分析常见的网络营销有哪些
  • 天津开发区建网站公司国外画册设计欣赏网站
  • wordpress+手机站目录公众号登陆
  • 安徽大学电子信息工程学院官方网江苏纯手工seo
  • 怎么挑选网站建设公司微网站开发微网站建设
  • 织梦教育培训网站源码黄骅贴吧在线
  • 西电信息化建设处网站一键优化助手
  • 杭州网站推广方案平台企业自建网站平台有哪些
  • 如何制作电脑公司网站asp做网站好不好
  • 请别人做网站需要注意什么中职专业设计网站
  • 四会建设局网站网站上传文件夹权限
  • 做网站有谁做wordpress社区模板
  • wordpress 全站加密有关优化网站建设的书籍
  • 珠海网站设计专业开发app公司
  • 门户网站建设方案文档太原代理记账公司
  • 电子商务网站建设与维护中职教材做图像网站
  • 三网合一网站建设计划自助wap建站
  • 网站建设从建立服务器开始wordpress整站搬迁
  • 长沙学校网站建设wordpress 去掉顶部
  • 培训机构网站设计好吗腾达建设网站
  • 整套网站建设环影视界免费版wordpress主题
  • 用php做的网站前后台模板做食品的网站设计要注意
  • 荧光字体制作网站百度网页版在线使用
  • 用php做购物网站wordpress 时间选择器
  • 江苏和城乡建设部网站首页已有域名 搭建网站
  • 免费模板简历网站深圳网站优化提供商
  • 网站设计建设流程图注册网站流程
  • 重庆做网站开发的公司做自己的网站给人的启发