黑马程序员技术交流社区

标题: 序列化和反序列化 [打印本页]

作者: 常帅    时间: 2011-7-23 16:44
标题: 序列化和反序列化
序列化和反序列化的是什么意思。最好说下用途和关键代码…
作者: 匿名    时间: 2011-7-23 17:16
可以写入输出流的对象称为可序列化对象,可序列化对象所属的类称为可序列化类,可序列化类必须实现接口java.io.Serializable.自动执行存储对象的过程,这种自动写对象的过程为对象序列化,它通过类objectoutputstream实现,相反为对象反序列化,它通过类objectinputstream实现。
class Login implements.java.io.Serializable{
privte String name;
private  transient String password; //对象序列化
.......
}
class A{}     //非序列化
class B implements .java.io.Serializable{
private int   i;
private static double  d;
private A a=new A();
}

上述类B对象是不可序列化的,如果试图序列化一个非序列化得对象,必须使用关键字transient关闭数据成员a的序列化。如下:
class B implements .java.io.Serializable{
private int   i;
private static double  d;
private transient   A  a=new A();
}
作者: 包志恒    时间: 2011-7-23 18:13
对象的序列化指将一个java对象写入io流中,与此对应的反序列化则是指从io流中恢复该java对象.如果需要让某个对象可以支持序列化,必须让它的类是可序列化的,即必须实现如下两个接口之一:
1 Serializable
2 Externalizable
例如:
import java.io.Serializable;
public class Person implements Serializable
{
        private String name = null;
        private int age = 0;
        public Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public int getAge()
        {
                return age;
        }
}
import java.io.*;
public class TestSerializable
{
        public static void main(String[] args)
        {
                ObjectOutputStream oos = null;
                ObjectInputStream ois=null;
                try
                {
                        oos = new ObjectOutputStream(new FileOutputStream("textperson.txt"));               
                        Person p = new Person("孙悟空",20);
                            oos.writeObject(p);
                            oos.close();
                        ois = new ObjectInputStream(new FileInputStream("textperson.txt"));
                        Person per = (Person) ois.readObject();
                        System.out.println(per.getAge());
                            ois.close();
                }
                catch (IOException ioe)
                {
                        ioe.printStackTrace();
                }
                catch(ClassNotFoundException cfe)
                {
                        cfe.printStackTrace();
                }
               
        }
}
[ 本帖最后由 包志恒 于 2011-07-23  18:15 编辑 ]
作者: 匿名    时间: 2011-7-23 19:59
序列化之后,可以用来保存到硬盘。下次运行程序可以直接读取上次保存的数据
作者: 匿名    时间: 2011-7-24 01:02
对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。
通过序列化可以永久性保存对象到本地文件中,也可以在网络中和进程间传递对象;

ObjectOutputStream代表对象输出流,其方法writeObject(Object obj)可以实现对象的序列化,将得到的字节序列写到目标输出流中。ObjectInputStream代表对象输入流,其readObject()方法能从源输入流中读取字节序列,将其反序列化为对象,并将其返回。

序列化一个对象非常之简单,仅仅实现一下Serializable接口即可,它调用自身预定义的默认序列化机制;如果不让系统使用缺省的方式进行序列化,那就必须在实现Serializable接口的同时还定义了私有的readObject()或writeObject()方法。
        public class MySerial implements java.io.Serializable {
          private void writeObject(java.io.ObjectOutputStream out) throws IOException
          { //... } //对对象的非transient的实例变量进行序列化
          private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
          { //... } //对对象的非transient的实例变量进行反序列化。
          //...
        }  
共同学习!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2