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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vipzh 中级黑马   /  2012-12-3 14:33  /  1258 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java类实现序列化,序列化是什么意思,怎么样实现啊?

5 个回复

倒序浏览
Serialization(序列化)是一种将对象以一连串的字节描述的过程。Java序列化API提供一种处理对象序列化的标准机制。

通常采用 implements Serializable  的方式就可以了,这种方式简单,没有要实现的构造函数和方法。
Serializable  含有的成员变量
public static final long serialVersionUID = 42L;

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。   
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
序列化是出现在操作对象流中,定义是把对象按照流的方式写入文件或者在网络中传输。类通过实现Serializable接口以启用其序列化功能,这个接口就是一个标识接口,就是告诉你,这个对象可以被对象流操作,也就是说,只有实现了序列化接口的对象才能被对象流操作。如果创建的流对象未被序列化,运行程序就会出现NotSerializableException异常!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 马纵驰 于 2012-12-4 13:21 编辑

对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。
注意:静态数据不能被序列化,因为静态数据不在堆内存中,是存储在静态方法区中。
如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。
Serializable:用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

import java.io.*;

class ObjectStreamDemo {
        public static void main(String[] args) throws Exception {
                writeObj();
                readObj();
        }

        public static void readObj() throws Exception {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                                "obj.txt"));
                Object obj = ois.readObject();// 读取一个对象。
                System.out.println(obj.toString());
        }

        public static void writeObj() throws IOException {
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
                                "obj.txt"));
                oos.writeObject(new Person("lisi", 25)); // 写入一个对象。
                oos.close();
        }
}

class Person implements Serializable {
        private static final long serialVersionUID = 42L;
        private transient String name;// 用transient修饰后name将不会进行序列化
        public int age;

        Person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public String toString() {
                return name + "::" + age;
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
Serialization(序列化)是一种将对象以一连串的字节描述的过程;
序列化的必要性
Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。
实现序列化
一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。
mport java.io.Serializable;  

class TestSerial implements Serializable {  

       public byte version = 100;  

       public byte count = 0;  

}
然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。我们将Byte流暂时存储到temp.out文件里。

public static void main(String args[]) throws IOException {  

       FileOutputStream fos = new FileOutputStream("temp.out");  

       ObjectOutputStream oos = new ObjectOutputStream(fos);  

       TestSerial ts = new TestSerial();  

       oos.writeObject(ts);  

       oos.flush();  

       oos.close();  

}
如果要从持久的文件中读取Bytes重建对象,我们可以使用ObjectInputStream。  

public static void main(String args[]) throws IOException {  

       FileInputStream fis = new FileInputStream("temp.out");  

       ObjectInputStream oin = new ObjectInputStream(fis);  

       TestSerial ts = (TestSerial) oin.readObject();  

       System.out.println("version="+ts.version);  

}
执行结果为

100.
对象的序列化格式

将一个对象序列化后是什么样子呢?打开刚才我们将对象序列化输出的temp.out文件,以16进制方式显示。内容应该如下:

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65

73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05

63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78

70 00 64

这一坨字节就是用来描述序列化以后的

TestSerial对象的,我们注意到TestSerial类中只有两个域:

public byte version = 100;

public byte count = 0;

且都是byte型,理论上存储这两个域只需要2个byte,但是实际上temp.out占据空间为51bytes,也就是说除了数据以外,还包括了对序列化对象的其他描述。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马