十、I/O流——8-对象序列化

对象序列化

1.序列化的含义和意义

(1)对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象;

(2)序列化机制允许将实现序列化的Java对象传换成字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序运行而独立存在;

(3)对象的序列化(Serialize)指将一个Java对象写入IO流中,于此对应的是对象的反序列化(Deserialize)指从IO流中恢复该java对象;

(4)为了让某个Java对象实现可序列化,此Java对象必须实现以下接口之一:

  1)Serializable

  2)Externalizable

(5)Serializable接口是一个标记接口,实现该接口无须实现任何方法,只是表明该类是可序列化的;

(6)所有可能在网络上传播的对象类都应该是可序列化的,否则会引起异常;

(7)所有的分布式应用常常需要跨平台、跨网络,所以要求所有传递的参数、返回值必须实现序列化,通常建议:程序创建的每个JavaBean都要实现Serializable接口。

2.使用对象流实现序列化

(1)使用ObjectOutputStream序列化对象示例:

Person类:

import java.io.Serializable;

//使用实现Serializable接口的方式使其可序列化
public class Person implements Serializable{
    private String name;
    private int age;
    //此处未提供无参数构造器
    public Person(String name,int age){
        System.out.println("有参数的构造器");
        this.name = name;
        this.age = age;
    }
    //setter、getter方法
    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;
    }
}

ObjectOutputStreamTest类:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamTest {
    public static void main(String[] args) throws Exception {
        //创建一个ObjectOutputStream输出流
        ObjectOutputStream os = null;
        try {
            os = new ObjectOutputStream(new FileOutputStream("object.txt"));
            Person p = new Person("test",18);
            //将p对象写入输出流
            os.writeObject(p);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            os.close();
        }
    }
}

(2)使用ObjectInputStream反序列化对象示例:

  使用上面序列化的程序,使用ObjectInputStreamTest反序列化

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class ObjectInputStreamTest {
    public static void main(String[] args) throws Exception{
        //创建一个ObjectInputStream对象
        ObjectInputStream in = null;
        try {
            in = new ObjectInputStream(new FileInputStream("object.txt"));
            //从输入流中读取一个JAVA对象,将其强制转换为Person对象
            Person p = (Person)in.readObject();
            System.out.println("该对象名字为:"+p.getName()+",该对象年龄为:"+p.getAge());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            in.close();
        }
    }
}

3.对象引用的序列化

4.自定义序列化

5.实现Externalizable接口的序列化

6.版本

 

posted @ 2017-08-02 20:45  丶theDawn  阅读(157)  评论(0编辑  收藏  举报