在 Java 中,**序列化文件(.ser 或自定义扩展名)**是通过 ObjectOutputStream 写出的对象,需要用 ObjectInputStream 来读取。
下面给你一个完整、清晰的说明和示例。
SerializableFileInputStream + ObjectInputStreamreadObject() 读取对象try-with-resources)import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) throws IOException {
User user = new User("Tom", 18);
try (ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("user.ser"))) {
oos.writeObject(user);
}
}
}
import java.io.*;
public class DeserializeDemo {
public static void main(String[] args) {
try (ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("user.ser"))) {
User user = (User) ois.readObject();
System.out.println(user);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
serialVersionUID 必须一致反序列化时,JVM 会校验:
private static final long serialVersionUID = 1L;
如果类结构变了但 serialVersionUID 不一致,会抛:
InvalidClassException
反序列化时:
否则会报:
ClassNotFoundException
private transient String password;
transient 字段反序列化后为 null
如果写入了多个对象:
while (true) {
try {
Object obj = ois.readObject();
System.out.println(obj);
} catch (EOFException e) {
break;
}
}
注意:
.json ❌ 不能用 ObjectInputStream如果你愿意,我可以:
你现在是读哪种序列化文件?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。