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

Serializable 和 Externalizable区别?

Serializable接口

java.io.Serializable 接口没有方法或字段,仅用于标识可序列化的语义。

public interface Serializable {
}

可序列化类的所有子类型本身都是可序列化的。在进行序列化操作时,会判断要被序列化的类是否是EnumArraySerializable类型,如果都不是则直接抛出NotSerializableException

@Data
public class A1_User implements Serializable {private String name;private int age;
}
A1_User user = new A1_User();
user.setName("xiaoming");
user.setAge(18);序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
oos.writeObject(user);反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("tempFile")));
A1_User newUser = (A1_User) ois.readObject();

Externalizable接口

public interface Externalizable extends java.io.Serializable {void writeExternal(ObjectOutput out) throws IOException;void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

需要重写writeExternal()与readExternal()方法。否则所有变量的值都会变成默认值。
重写就会很灵活,可以随意加减属性

@Data
public class B1_User implements Externalizable {private String name;private int age;public void writeExternal(ObjectOutput out) throws IOException {out.writeObject(name);out.writeInt(age);}public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name = (String) in.readObject();age = in.readInt();}
}
B1_User user = new B1_User();
user.setName("xiaoming");
user.setAge(18);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
oos.writeObject(user);ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("tempFile")));
B1_User newUser = (B1_User) ois.readObject();

两种序列化的对比

实现Serializable接口实现Externalizable接口
所有属性自动都会被序列化,简单但死板需要重写writeExternal()与readExternal()方法,啰嗦但灵活
性能略差性能略好
必须要提供一个public的无参的构造器
http://www.lryc.cn/news/111495.html

相关文章:

  • 2023 电赛 E 题 K210 方案--K210实现矩形识别
  • 【雕爷学编程】MicroPython动手做(29)——物联网之SIoT 2
  • chapter13:springboot与任务
  • (十一)大数据实战——hadoop高可用之HDFS手动模式高可用
  • problem(3):python IDE和python解释器
  • 【C语言进阶篇】模拟实现通讯录 (内附源码)
  • Python web实战之 Django 的模板语言详解
  • 使用ChatGPT编写技术文档
  • Java超级玛丽小游戏制作过程讲解 第四天 创建并完成常量类03
  • webpack基础知识八:说说如何借助webpack来优化前端性能?
  • JAVA SE -- 第十五天
  • macOS 环境变量加载探究
  • 在程序中如何判断该线程的线程id(get_id())的返回值是一个无效值
  • ffmpeg-ffplay代码架构简述
  • ⛳ 多线程面试-什么是多线程上下文切换?
  • vb+SQL车辆管理系统设计与实现
  • java的枚举类
  • 基于java早餐店点餐系统源码设计与实现
  • ODOO16如何处理采购运输正常损耗的成本价核算?
  • 【数据预测】基于白鲸优化算法BWO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#54】
  • 函数式编程-将过程作为返回值的应用:分步过程
  • Mysql-学习笔记
  • 【雕爷学编程】Arduino动手做(187)---1.3寸OLED液晶屏模块2
  • Windows用户如何安装新版本cpolar内网穿透
  • MacBookPro安装Win10,Wifi不能用了,触控板不能用了(2)
  • 理解C++中变量的作用域
  • vue+element-ui给全局请求设置一个loading样式
  • 传球游戏
  • 智能卡通用安全检测指南 思度文库
  • Maven设置阿里云路径(防止加载过慢)