java对象序列化是将对象转换为字节序列以便存储或传输,反序列化则是将其恢复为对象;2. 主要应用于数据持久化、网络传输、进程间通信和缓存;3. transient关键字用于阻止字段被序列化,常用于保护敏感信息或排除运行时状态;4. serialversionuid用于确保序列化版本兼容性,显式定义可避免因类结构变化导致的反序列化失败。

Java中对象的序列化与反序列化,简单来说,就是把一个Java对象转换成字节序列,以便存储或传输,之后再将字节序列恢复成Java对象的过程。这对于数据持久化、网络通信或者跨进程数据交换来说,简直是基础中的基础,尤其在分布式系统里,更是绕不开的话题。
在Java里实现对象的序列化和反序列化,核心其实就围绕着
java.io.Serializable
java.io.ObjectOutputStream
java.io.ObjectInputStream
Serializable
具体操作起来,通常是这样: 你需要让你的类实现
Serializable
User
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L; // 后面会聊到这个
private String name;
private int age;
private transient String password; // 假设密码不希望被序列化
public User(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
// Getters and Setters (实际开发中会有,这里省略)
public String getName() { return name; }
public int getAge() { return age; }
public String getPassword() { return password; }
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", password='" + password + '\'' + // 这里会看到transient的效果
'}';
}
}然后,进行序列化(写入文件为例):
立即学习“Java免费学习笔记(深入)”;
import java.io.*;
public class SerializationDemo {
public static void main(String[] args) {
User user = new User("张三", 30, "mySecretPass");
try (FileOutputStream fileOut = new FileOutputStream("user.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(user);
System.out.println("User对象已序列化到 user.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}接着,进行反序列化(从文件读取):
import java.io.*;
public class DeserializationDemo {
public static void main(String[] args) {
User user = null;
try (FileInputStream fileIn = new FileInputStream("user.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
user = (User) in.readObject();
System.out.println("User对象已从 user.ser 反序列化");
System.out.println("反序列化后的对象: " + user);
// 验证transient字段
System.out.println("密码 (transient): " + user.getPassword());
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
System.out.println("User class not found");
c.printStackTrace();
}
}
}运行
SerializationDemo
DeserializationDemo
password
null
transient
我个人觉得,序列化这东西,最直观的用处就是“存起来”和“传出去”。想象一下,你辛辛苦苦在内存里构建了一个复杂的数据结构,一个对象图,程序一关机,这些就全没了,多可惜啊。序列化就是提供了一种机制,能把这些内存中的“活生生”的对象,变成一堆字节,然后你可以把这堆字节写到硬盘上,或者通过网络发送给另一个程序。
具体到应用场景,我觉得有几个地方特别突出:
总之,序列化提供了一种将对象状态固化的能力,让数据能够跨越时间(持久化)和空间(网络传输)的限制。
transient
transient
ObjectOutputStream
transient
null
false
它的实际用途,最典型的就是处理那些不适合被序列化、或者序列化了也没意义的字段。
User
password
transient
transient
Person
firstName
lastName
fullName
fullName
transient
要避免敏感信息被序列化,
transient
Externalizable
readObject
writeObject
版本兼容性问题,这是Java序列化里一个比较头疼但又不得不面对的问题。想象一下,你序列化了一个对象,过了一段时间,你修改了类的结构(比如加了字段、删了字段、改了字段类型),然后你试图用新版本的类去反序列化旧版本的字节流,或者反过来。这时候,Java的默认序列化机制可能就会“懵圈”,抛出
InvalidClassException
这就是
serialVersionUID
long
Serializable
serialVersionUID
serialVersionUID
serialVersionUID
serialVersionUID
InvalidClassException
serialVersionUID
serialVersionUID
transient
serialVersionUID
serialVersionUID
如何处理兼容性:
serialVersionUID
private static final long serialVersionUID = 1L;
static
transient
serialVersionUID
serialVersionUID
serialVersionUID
ClassCastException
serialVersionUID
readObject
writeObject
Externalizable
readObject
writeObject
readObject
Externalizable
在我看来,
serialVersionUID
以上就是java使用教程怎样实现对象的序列化与反序列化 java使用教程的序列化操作技巧的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号