对象的序列化与反序列化

来源:互联网 发布:金庸小说 知乎 话题 编辑:程序博客网 时间:2024/05/16 13:03

对象序列化就是把一个对象变为二进制的数据流的一种方法。通过对象序列化可以方便地实现对象的传输或存储。

如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。此接口的定义如下

    public interface Serializable{}

此接口中没有定义任何的方法,所以此接口是一个标识接口。实现此接口的类表示已经具备了序列化的能力。

例:定义可序列化的类

class Person implements Serializable{    private String name;    public Person(String name)    {        this.setName(name);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString()    {        return "my name is "+this.name;    }}

以上的类已经具备序列化的能力。所以此类的对象是可以经过二进制数据流进行传输的。而如果要完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。

使用对象输出流输出序列化对象的步骤有时称为序列化,而使用对象输入流输入对象的过程称为反序列化。

1.对象输出流 ObjectOutputStream

一个对象如果要进行输出,则必须使用对象输出流ObjectOutputStream类。

例:将Person类的对象保存在文件中

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.io.Serializable;public class Main {        public static void main (String args[]) throws Exception        {           String path="E:"+File.separator+"t.txt";           File f=new File(path);           ObjectOutputStream oos=null;           OutputStream out=new FileOutputStream(f);  //文件输出流           oos=new ObjectOutputStream(out);  //为对象输出流实例化           oos.writeObject(new Person("xinghang"));  //保存对象到文件           oos.close(); //关闭输出        }       }

注意:一个对象被序列化后,只有对象中的属性被保存下来了,而方法则没有别保存。

2.对象输入流 ObjectInputStream

例:从文件中将Person对象反序列化(读取)

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.io.Serializable;public class Main {        public static void main (String args[]) throws Exception        {           String path="E:"+File.separator+"t.txt";           File f=new File(path);           ObjectInputStream ois=null;           InputStream in=new FileInputStream(f);  //文件输出流           ois=new ObjectInputStream(in); //实例化对象输入流           Object o=ois.readObject(); //读取对象           ois.close();           System.out.println(o);        }       }

3.transient 关键字

当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化,则可以使用transient关键字进行声明,代码如下:

class Person implements Serializable{    private transient String name;    public Person(String name)    {        this.setName(name);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString()    {        return "my name is "+this.name;    }}

此时,若对Person类的实例化对象进行序列化,那么其中name属性将不会被保存。在进行反序列化时,读取name的值也为null。

0 0
原创粉丝点击