网站首页 > 技术文章 正文
序列化(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内置的机制已经足够。但对于更复杂或高性能的需求,使用专业的序列化库可能会更好。
- 上一篇: Java基础——Java多线程(Lock接口详解)
- 下一篇: 序列化,Java的实现方式
猜你喜欢
- 2025-01-21 Java通用树结构数据管理
- 2025-01-21 java基础知识点总结1
- 2025-01-21 Java中的枚举,这一篇全了,一些不为人知的干货
- 2025-01-21 「避坑宝典」为大家分享笔者在22 年所遇到“匪夷所思”的 Bug 趣事
- 2025-01-21 java集合框架03——ArrayList和源码分析
- 2025-01-21 java-socket长连接demo体验
- 2025-01-21 netty系列之:使用Jboss Marshalling来序列化java对象
- 2025-01-21 JAVA序列化那些事儿
- 2025-01-21 作为一名程序猿,你不可不知的Java基础知识的三十个经典问答
- 2025-01-21 序列化,Java的实现方式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)