黑马程序员技术交流社区

标题: 对象序列化 [打印本页]

作者: 邱纲    时间: 2012-2-18 10:33
标题: 对象序列化
1.对象怎么序列化啊,为什么要将对象序列化,一般什么时候要用呢?
作者: 梁锡伟    时间: 2012-2-18 13:00
一般用不着。序列化是为了网络传送方便。
作者: 郭繁森    时间: 2012-2-18 13:34
有个序列化流,作用是把多流合并一个流,然后按一般的流使用
作者: 吴文华    时间: 2012-2-18 13:59
本帖最后由 吴文华 于 2012-2-18 14:00 编辑

其实很简单,一个对象对于我们来说的意义其实就是对象里保存的那些数据,序列化就是把这些数据转换成二进制 表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。下面给出一个最简单的Java的序列化与反序列化的例子,看懂 这个例子,相信你应该能大概理解这是怎么一回事了。
首先是一个Peraon类:
Person.java

Java代码
package com.lanber.serial;   
   
import java.io.Serializable;   
   
public class Person implements Serializable {   
    private String name;   
    private int age;   
    private String sex;   
    private String nationality;   
   
    public Person(String _name, int _age, String _sex, String _nationality) {   
        this.name = _name;   
        this.age = _age;   
        this.sex = _sex;   
        this.nationality = _nationality;   
     }   
   
    public String toString() {   
        return "Name:" + name + "\nAge:" + age + "\nSex:" + sex   
                 + "\nNationality:" + nationality + "\n\n";   
     }   
}   
package com.lanber.serial;  import java.io.Serializable;  public class Person implements Serializable {  private String name;  private int age;  private String sex;  private String nationality;   public Person(String _name, int _age, String _sex, String _nationality) {   this.name = _name;   this.age = _age;   this.sex = _sex;   this.nationality = _nationality;  }   public String toString() {   return "Name:" + name + "\nAge:" + age + "\nSex:" + sex     + "\nNationality:" + nationality + "\n\n";  } }
而后我们要实例化一个Person对象,把我们实例化出来的这个对象序列化,并把序列化后的对象流保存到文件中去:
WritePerson.java

Java代码
package com.lanber.serial;   
   
import java.io.*;   
   
public class WritePerson {   
   
    public static void main(String[] args) {   
        try {   
             ObjectOutputStream oos = new ObjectOutputStream(   
                    new FileOutputStream("Person.tmp"));   
             Person obj = new Person("Tony", 25, "Female", "han");   
             System.out.println("将Person对象写入到文件Person.tmp中...");   
             oos.writeObject(obj);   
             oos.close();   
             System.out.println("完成!");   
         } catch (Exception e) {   
             System.out.println(e);   
         }   
   
     }   
}   
package com.lanber.serial;  import java.io.*;  public class WritePerson {   public static void main(String[] args) {   try {    ObjectOutputStream oos = new ObjectOutputStream(      new FileOutputStream("Person.tmp"));    Person obj = new Person("Tony", 25, "Female", "han");    System.out.println("将Person对象写入到文件Person.tmp中...");    oos.writeObject(obj);    oos.close();    System.out.println("完成!");   } catch (Exception e) {    System.out.println(e);   }   } }
这样,我们就把序列化后的二进制对象流保存到Person.tmp的文件中去了(特别要注意这里的oos.writeObject()方法, 这个方法就是实现把obj对象序列化的方法)。你可以打开生成的这个文件查看,不过我们是看不懂这里面的信息的,因为这是二进制数据啊。
作者: 何招俊    时间: 2012-2-18 15:33
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

   序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
作者: 彭坤    时间: 2012-2-19 14:38
将某类实现Serializable接口就能达到对象序列化的目的。
对象的序列化是为了直把对象做为一个流传送出去,然后再从流中读出这个对象。
换句话说你可以用它把一个对象通过网络从一台机器传送到另外一台机器上,或者把对象永久保存在一个文件上,再下次运行程序的时候再从文件中读出这个对象。
作者: 仵先进    时间: 2012-2-19 14:46
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
作者: 【专】【属】    时间: 2012-2-19 18:02
在看张老师以前的视频时,如像是在有网络负载问题时可能会用到了。或者在将数据写到硬盘时,在硬盘回写时用到序列化.




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