网站首页 > java教程 正文
在第4章,问题X中,我们讨论了Java记录的序列化/反序列化,所以您应该对这些操作非常熟悉。简而言之,序列化是将内存中的对象转换为字节流的过程,这些字节流也可以存储在内存中或写入文件、网络、数据库、外部存储等。反序列化是从给定的字节流中重新创建内存中对象状态的反向过程。如果一个Java对象的类实现了java.io.Serializable(或java.io.Externalizable),则该对象是可序列化的。通过java.io.ObjectOutputStream和java.io.ObjectInputStream类以及writeObject()/readObject()方法完成序列化/反序列化。 例如,假设有以下Melon类:
public class Melon implements Serializable {
private final String type;
private final float weight;
// 构造函数,getter,setter
}
以及一个Melon的实例:
Melon melon = new Melon("Gac", 2500);
将melon实例序列化为字节数组可以按照以下方式完成:
public static byte[] objectToBytes(Serializable obj)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream ois = new ObjectOutputStream(baos)) {
ois.writeObject(obj);
}
baos.close();
return baos.toByteArray();
}
当然,我们可以使用这个助手来序列化任何其他对象,但对于melon实例,我们这样调用它:
byte[] melonSer = Converters.objectToBytes(melon);
反序列化是通过另一个使用readObject()的助手完成的,如下所示:
public static Object bytesToObject(byte[] bytes)
throws IOException, ClassNotFoundException {
try ( InputStream is = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(is)) {
return ois.readObject();
}
}
我们可以使用这个助手将任何其他对象从字节数组中反序列化,但对于melonSer,我们这样调用它:
Melon melonDeser = (Melon) Converters.bytesToObject(melonSer);
返回的melonDeser恢复了初始对象状态,即使它不是同一个实例。在打包的代码中,您还可以看到一种基于Apache Commons Lang的方法。
猜你喜欢
- 2024-10-11 JAVA练习题:定义一个数组,获取数组中最大最小值
- 2024-10-11 java中数组(二)(java数组的常见操作)
- 2024-10-11 灵魂拷问:Java如何获取数组和字符串的长度length还是length()?
- 2024-10-11 前后端分离文件上传系列:在安卓系统中将文件转换为字符串并上传
- 2024-10-11 java集合转换数组注意问题(javalist集合转换数组)
- 2024-10-11 尚学堂java学习笔记:数组的返回(java数组作为返回值)
- 2024-10-11 Scala:Array(集合、序列)(scala arraylist)
- 2024-10-11 List与String相互转化的几种方式归纳
- 2024-10-11 Java将字符串解析为Json格式(java字符串解析成数组)
- 2024-10-11 springboot项目中,前端如何传递一个自定义对象数组给后端
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)