您的位置:首页 > 编程语言 > Java开发

Java对象的序列化与反序列化

2017-01-16 14:18 197 查看

1.什么是序列化与反序列化?

序列化:指将对象的状态数据以字节流的形式进行处理,在文件中长期存储。

反序列:从字面上就能知道,指的就是在需要的时候从文件中获取该对象的信息以重新获得一个完全的对象。

2.序列化与反序列化的作用?

(1)永久性保存对象,把对象通过序列化字节流保存到本地文件中。

(2)通过序列化在网络中传递对象

(3)通过序列化在进程间传递对象

3. 实现序列化的两种接口

(1)Serializable接口

(2)Externalizable接口:该接口继承了Serializable接口,是对Serializable的扩展,并提供了readExternal(ObjectInput in)和writeExternal(ObjectOutout out)两种方法,通过重写这两个方法来实现自身的序列化行为的控制。在对实现了Externalizable的类的对象进行反序列化时,会先调用该类的无参构造函数,若无参构造函数被删除或被设置为private、default或protected时会抛出java.io.InvalidException:no valid construction等

4. 对象的序列化编码步骤

1)序列化实现步骤:

(1)需要序列化的对象所属类必须实现Serializable接口;

(2)构造FileOutputStream对象;

(3)构造ObjectOutputStream对象;

(4)使用ObjectOutputStream对象的writeObject()方法进行序列化;

(5)关闭ObjectOutputStream对象;

(6)关闭FileOutputStream对象;

(7)对序列化全程捕获IOException;

2)反序列化实现步骤:

(1)需要序列化的对象所属类必须实现Serializable接口;

(2)构造FileInputStream对象;

(3)构造ObjectInputStream对象;

(4)使用ObjectInputStream对象的readObject()方法进行反序列化;

(5)关闭ObjectInputStream对象;

(6)关闭FileInputStream对象;

(7)对序列化全程捕获ClassNotFoundException和IOException;

3)注意:

1. 只有实现了Serializable或Externalizable的类的对象才可以实现序列化。

2. 对象和对象数组都可以实现序列化

3. 若一个父类实现了Serializable或Externalizable接口,其子类均实现了Serializable或Externalizable接口。

4. 实现Serializable或Externalizable接口的类应提供无参构造函数

5. static的属性和方法不能被序列化,因为static的属性和方法与对象无关,而序列化和反序列化则是针对对象而言的。

6. 对于不希望被序列化的非static成员和方法可以使用transient关键字标明.(关于transient关键字的用法参考博文Java的transient关键字)

7.若一个序列化子类的父类是非序列化的,则该子类从父类继承下来的变量将恢复其默认初始值而不被初始化。

示例代码:

package effectivejava;

import java.io.*;
import java.util.Date;

/**
* Created by louyuting on 16/11/11.
* 序列化与反序列化
*/
class Customer implements Serializable{
private String name;
private String age;

public Customer() {
}

public Customer(String age, String name) {
this.age = age;
this.name = name;
}

@Override
public String toString() {
return "name=" + this.name + ", age="+this.age;
}
}

public class SerializableTest {

public static void main(String[] args) throws IOException, ClassNotFoundException {
//获取序列化对象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/opt/objectFile.obj"));

Customer customer = new Customer("娄宇庭", "24");
out.writeObject("你好!");
out.writeObject(new Date());
out.writeObject(customer);
out.close();

//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("/opt/objectFile.obj"));
System.out.println("obj1:"+ (String)in.readObject());
System.out.println("obj2:"+ (Date)in.readObject());
System.out.println("obj3:"+ (Customer)in.readObject());
in.close();
}

}


运行结果:



实例代码的gitHub地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息