A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java中对象序列化的作用是什么?全面一点

7 个回复

倒序浏览
可以用对象流把对象封装的信息写进硬盘文件和从硬盘文件中读取对象信息。
就是对象的持久化。
跟我们用Hibernate把对象存进数据库一个意思
回复 使用道具 举报
所谓序列化其实就是将程序中的数据(对象)通过某种方式,保存到本地中。
然后可以在程序关闭之后还保存程序的某个执行状态,方便在程序下次
执行的时候通过"反序列化"读取出来,并且能够还原数据的类型,从而延续程序退出时的状态。
一般来说,我们会使用序列化保存一些需要持久化的数据,当然如果这个数据会比较庞大的话,
我们就直接使用数据库了!所以,序列化实际上目前很多领域用的已经不多了,大部分使用
都已被数据库替代了!
回复 使用道具 举报
回复 使用道具 举报
序列化接口在网络传输中的作用:
在传输的时候就相当于把数据按照一定的顺序格式排列,这样就可以在跨平台中使用。

在文件保存中的作用:
该类是JAVA提供通用数据保存和读取的接口,如果你想把一个对象保存到文件中就必须要实现序列化接口
回复 使用道具 举报
Serializable只是为了标注该对象是可被序列化的。
序列化:将java对象存储到硬盘,jre本身就提供了这种支持,可以调用OutputStream的writeObject方法来做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
也就是说没有实现这Serializable接口的类不可以被序列化。具体那些类,可以查阅文档,写的很明白。
回复 使用道具 举报
鲁蒙 黑马帝 2011-10-8 19:29:31
7#
Java 对象序列化是 JDK 1.1 中引入的一组开创性特性之一,用于作为一种将 Java 对象的状态转换为字节数组,以便存储或传输的机制,以后,仍可以将字节数组转换回 Java 对象原有的状态。

实际上,序列化的思想是 “冻结” 对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后 “解冻” 状态,重新获得可用的 Java 对象。所有这些事情的发生有点像是魔术,这要归功于 ObjectInputStream/ObjectOutputStream 类、完全保真的元数据以及程序员愿意用 Serializable 标识接口标记他们的类,从而 “参与” 这个过程。

清单 1 显示一个实现 Serializable 的 Person 类。


清单 1. Serializable Person
                               
package com.tedneward;

public class Person
    implements java.io.Serializable
{
    public Person(String fn, String ln, int a)
    {
        this.firstName = fn; this.lastName = ln; this.age = a;
    }

    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public int getAge() { return age; }
    public Person getSpouse() { return spouse; }

    public void setFirstName(String value) { firstName = value; }
    public void setLastName(String value) { lastName = value; }
    public void setAge(int value) { age = value; }
    public void setSpouse(Person value) { spouse = value; }

    public String toString()
    {
        return "[Person: firstName=" + firstName +
            " lastName=" + lastName +
            " age=" + age +
            " spouse=" + spouse.getFirstName() +
            "]";
    }   

    private String firstName;
    private String lastName;
    private int age;
    private Person spouse;

}


将 Person 序列化后,很容易将对象状态写到磁盘,然后重新读出它,下面的 JUnit 4 单元测试对此做了演示。


清单 2. 对 Person 进行反序列化
                               
public class SerTest
{
    @Test public void serializeToDisk()
    {
        try
        {
            com.tedneward.Person ted = new com.tedneward.Person("Ted", "Neward", 39);
            com.tedneward.Person charl = new com.tedneward.Person("Charlotte",
                "Neward", 38);

            ted.setSpouse(charl); charl.setSpouse(ted);

            FileOutputStream fos = new FileOutputStream("tempdata.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(ted);
            oos.close();
        }
        catch (Exception ex)
        {
            fail("Exception thrown during test: " + ex.toString());
        }
        
        try
        {
            FileInputStream fis = new FileInputStream("tempdata.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            com.tedneward.Person ted = (com.tedneward.Person) ois.readObject();
            ois.close();
            
            assertEquals(ted.getFirstName(), "Ted");
            assertEquals(ted.getSpouse().getFirstName(), "Charlotte");

            // Clean up the file
            new File("tempdata.ser").delete();
        }
        catch (Exception ex)
        {
            fail("Exception thrown during test: " + ex.toString());
        }
    }
}


到现在为止,还没有看到什么新鲜的或令人兴奋的事情,但是这是一个很好的出发点。我们将使用 Person 来发现您可能不 知道的关于 Java 对象序列化 的 5 件事。

回复 使用道具 举报
王家俊 黑马帝 2011-10-9 00:14:56
8#
一般我们创建一个对象后如果这个对象没有引用再指向它的时候这个对象的生命就结束了,在某段时间内会被垃圾回收器清除掉。为了让这些已经被创建的对象能够长久的保存,就是要了对象序列化的办法,即:让创建这个对象的类实现java.io.Serializable 接口,这样就可以把使用这个类创建的对象转成二进制数据存储到硬盘上,这样就把这个对象长久的保存了,延长了对象的生命。当我们下一次再次使用这个对象时就可以通过反序列化的方式把那个存储的对象取出来用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马