Java对象的序列化与反序列化是Java中非常重要的一个概念。在日常开发中,我们经常需要将Java对象序列化为字节流进行传输或者存储在文件系统中,或者从字节流中反序列化出Java对象。下面详细讲解Java对象序列化与反序列化的完整攻略。
什么是Java对象的序列化
Java对象的序列化是指将Java对象转化为字节流的过程。可以把Java对象序列化后写到磁盘上,也可以把Java对象序列化后通过网络传输。Java对象的序列化能够解决2个问题:
- Java对象在内存中是存在的,需要将Java对象持久化,让他们能够在多次执行中被使用;
- Java对象需要跨进程传输,但是Java虚拟机和其他语言间对象并不兼容,这时候就需要将Java对象序列化,让其他语言也可以访问。
在Java中的序列化和反序列化是通过 java.io.ObjectOutputStream
和 java.io.ObjectInputStream
完成的。一个对象被序列化之后会被转换成字节序列,再利用ObjectInputStream进行反序列化得到Java对象。
以下是Java对象序列化的示例代码:
import java.io.*;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public static void main(String[] args) throws Exception {
Person p = new Person("张三", 20);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.txt"));
out.writeObject(p);
out.close();
}
}
在以上代码中,我们定义了一个 Person
类,并实现 Serializable
接口,这样就可以将 Person
对象序列化。在 main
方法中,我们创建一个 Person
对象 p
,并将其序列化到磁盘上,存放在 person.txt
文件中。
反序列化Java对象
反序列化就是将Java对象序列化的字节流转换为Java对象的过程。在Java中,对象反序列化是使用ObjectInputStream来实现的。
反序列化需要注意的是,如果对于反序列化一个已经被改动的类,或者序列化的字节流被篡改过,那么会抛出InvalidClassException异常。
以下是Java对象反序列化的示例代码:
import java.io.*;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public static void main(String[] args) throws Exception {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.txt"));
Person p = (Person) in.readObject();
in.close();
System.out.println(p.getName() + " " + p.getAge());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在以上代码中,我们创建了一个 Person
对象,并将其序列化到一个文件中。在 main
方法中,我们反序列化 person.txt
文件,得到返回的 Person
对象 p
。
Java对象的序列化与反序列化的注意事项
在实际应用中需要注意以下几个问题:
- 序列化后转换成的字节流需要压缩,减少网络传输;
- 序列化不同版本的类可能会产生异常,需要及时更新版本的序列化id;
- 序列化机制不仅能序列化对象,还可以序列化数组,普通变量等。
以上就是Java对象序列化和反序列化的完整攻略。它能帮助你更好的使用Java对象序列化和反序列化机制,且让你更加深入地理解Java对象序列化和反序列化的工作原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象的序列化与反序列化详解 - Python技术站