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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄敏 中级黑马   /  2012-9-17 20:45  /  2067 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄敏 于 2012-9-17 20:50 编辑

77、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。

答案:    我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。

     例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。


上面的概念是理解了  但是新的问题又来了

对象序列化为什么存在?出现的目的是干嘛的?最实在用作用在哪   实际应用有哪些    需要能举个典型的例子解释其应用

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
序列的根本应该是为了保存数据 保存状态总得有个顺序 序列化就是把内存中对象以一种可以保存的形式保存起来
场景当然在操作对象的时候
回复 使用道具 举报
序列化是把对象中的数据转换成二进制表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。举个例子
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的文件中去了

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先注意序列化机制允许将实现序列化的java对象转换成为字节序列,这些字节序列可以保存在硬盘上,或是通过网络传输,以备以后恢复对象。序列化机制使的对象可以脱离程序而独立运行!
有序列化自然就有反序列化:
先定义一个person类
public class Person
        implements java.io.Serializable
{
        private String name;
        private int age;
        // 注意此处没有提供无参数的构造器!
        public Person(String name , int age)
        {
                System.out.println("有参数的构造器");
                this.name = name;
                this.age = age;
        }
        // 省略name与age的setter和getter方法

        // name的setter和getter方法
        public void setName(String name)
        {
                this.name = name;
        }
        public String getName()
        {
                return this.name;
        }

        // age的setter和getter方法
        public void setAge(int age)
        {
                this.age = age;
        }
        public int getAge()
        {
                return this.age;
        }

        private void writeObject(java.io.ObjectOutputStream out)
                throws IOException
        {
                // 将name Field的值反转后写入二进制流
                out.writeObject(new StringBuffer(name).reverse());
                out.writeInt(age);
        }
        private void readObject(java.io.ObjectInputStream in)
                throws IOException, ClassNotFoundException
        {
                // 将读取的字符串反转后赋给name Field
                this.name = ((StringBuffer)in.readObject()).reverse()
                        .toString();
                this.age = in.readInt();
        }
}
现在讲一个person对象写到磁盘上:
public class WriteObject
{
        public static void main(String[] args)
        {
                try(
                        // 创建一个ObjectOutputStream输出流
                        ObjectOutputStream oos = new ObjectOutputStream(
                                new FileOutputStream("object.txt")))
                {
                        Person per = new Person("孙悟空", 500);
                        // 将per对象写入输出流
                        oos.writeObject(per);
                }
                catch (IOException ex)
                {
                        ex.printStackTrace();
                }
        }
}
下面示范从感刚刚生成的object.txt文件中读取person对象:
public class ReadObject
{
        public static void main(String[] args)
        {
                try(
                        // 创建一个ObjectInputStream输入流
                        ObjectInputStream ois = new ObjectInputStream(
                                new FileInputStream("object.txt")))
                {
                        // 从输入流中读取一个Java对象,并将其强制类型转换为Person类
                        Person p = (Person)ois.readObject();
                        System.out.println("名字为:" + p.getName()
                                + "\n年龄为:" + p.getAge());
                }
                catch (Exception ex)
                {
                        ex.printStackTrace();
                }
        }
}
希望这些对你会有帮助!

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马