网站首页 > 精选教程 正文
序列化(Serialization)和反序列化(Deserialization)操作,是在Java中将对象转换为字节流以及从字节流还原为对象的过程操作。下面我们就来详细介绍一下Java中的序列化和反序列化操作。
序列化(Serialization)
序列化是将一个Java对象转换为一个字节流的操作,这样就可以保存对象的状态或者是对对象进行网络传输操作。
我们可以将需要序列化的Java类继承实现java.io.Serializable接口实现,然后通过ObjectOutputStream类调用其writeObject方法进行序列化操作,如下所示。
import java.io.*;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Person object serialized.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
反序列化(Deserialization)
反序列化操作就是序列化的逆向操作,是从字节流中恢复对象的过程,我们可以通过ObjectInputStream类调用其readObject方法进行反序列化操作,如下所示。
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println("Person object deserialized: " + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
序列化细节与注意事项
serialVersionUID是在序列化操作中用于版本控制的唯一标识符,如果在进行序列化操作的过程中,类的结构发生了变化,那么我们可以通过设置设置或更新serialVersionUID的值来控制类版本的兼容性。
如果在使用过程中没有显式的声明serialVersionUID,那么在JVM中会根据类的结构自动生成,但是这种操作可能会导致在类修改后导致不兼容情况发生。
当然除了提供的默认的序列化方式之外,我们还可以自定义序列化操作,如下所示。可以实现writeObject和readObject方法。
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeObject(encrypt(password));
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
this.password = decrypt((String) ois.readObject());
}
使用外部库进行序列化
有时候,Java内置的序列化机制性能可能不是最优的,并且序列化后的数据不是人类可读的,如果在某些场景中,需要更好的性能或可读性,可以使用一些外部库,如下所示。
- JSON序列化库:如Jackson、Gson等,用于将对象序列化为JSON格式。
- XML序列化库:如XStream,用于将对象序列化为XML格式。
- 二进制序列化库:如Protocol Buffers、Kryo等,用于高效的二进制序列化。
我们可以通过外部的序列化库对Java对象进行序列化操作,这样利用自定义的特性我们就可以实现出高效的Java对象序列化方式。
总结
Java的序列化和反序列化机制非常方便,但需要注意其潜在的安全和性能问题。对于简单的对象保存和传输,Java内置的机制已经足够。但对于更复杂或高性能的需求,使用专业的序列化库可能会更好。
猜你喜欢
- 2025-01-12 手把手教你搭建一个基于Java的分布式爬虫系统「转」
- 2025-01-12 Fastjson 2.x完美融合:让Spring Boot的JSON处理性能飞跃
- 2025-01-12 fastjson自定义序列化竟然有这么多姿势?
- 2025-01-12 Spring Boot 如何压缩JSON数据并且将其存储到Redis中?
- 2025-01-12 将Excel表格直接导出成JSON文件格式的一个小工具
- 2025-01-12 Fastjson反序列化由浅入深
- 2025-01-12 Java基础-序列化&反序列化详解
- 2025-01-12 java千问-springboo2升级3返回json的奇怪问题
- 2025-01-12 太赞了!程序员必备工具,JSON到代码的快速转换器!
- 2025-01-12 java中常用的22种数据类型转换,超详细!
你 发表评论:
欢迎- 07-10动漫人物像|插画 壁纸 头像 签名 素材
- 07-10运动人物|插画 壁纸 头像 签名 素材
- 07-10动漫人物|插画 壁纸 头像 签名 素材
- 07-10神话人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物像|插画 壁纸 头像 签名 素材
- 07-10 日漫人物|插画 壁纸 头像 签名 素材
- 07-10日漫人物风|插画 壁纸 头像 签名 素材
- 07-10日漫人物|插画 壁纸 头像 签名 素材
- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)