Java学习之序列化

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

类ObjectInputStream 和ObjectOutputStream是高层次的数据流,它们包含序列化和反序列化对象的方法。

示例:

一、实现了序列化接口Serializable的实体类

package com.serialize;

import java.io.Serializable;
/**
 * Employee员工类,并且实现了Serializable序列化接口
 * 请注意,一个类的对象要想序列化成功,必须满足两个条件:
 * 1、该类必须实现 java.io.Serializable 对象。
 * 2、该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
 * @author feizi
 * @time 2015-1-19下午6:01:11
 */
public class Employee implements Serializable {

    private static final long serialVersionUID = -6290787164737383314L;

    public String name;
    public String address;
    public transient int SSN;
    public int number;

    public void mailCheck(){
        System.out.println("Mailing a check to "+name+" "+address);
    }

}

二、序列化

package com.serialize;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * Java序列化对象
 * @author ruanpeng
 * @time 2015-1-19下午6:00:29
 */
public class SerializeDemo {

    public static void main(String[] args) {
        Employee e = new Employee();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 111222333;
        e.number = 101;

        //ObjectOutputStream 类用来序列化一个对象
        try {

            //当序列化一个对象到文件时, 按照Java的标准约定是给文件一个.ser扩展名。

            //1,直接写成下面这种方式,但是前提要这个tmp文件夹要提前创建好(已经存在),否则运行的时候会报出找不到路径的错误
            FileOutputStream fileOut = new FileOutputStream("tmp/employee.ser");

            //2、或者不要前面的tmp文件夹了,直接写文件名,都可以
//          FileOutputStream fileOut = new FileOutputStream("employee.ser");

            //3、或者使用java API自身提供的File类来创建文件夹路径,那么上面的那句代码就可以换成下面的
            /*File tmpFolder = new File("/tmp");
            if(!tmpFolder.exists()){
                tmpFolder.mkdir();
            }

            FileOutputStream fileOut = new FileOutputStream(tmpFolder+"/employee.ser");*/

            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in tmp/employee.ser");
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

三、反序列化

package com.serialize;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 反序列化对象
 * @author ruanpeng
 * @time 2015-1-19下午6:13:56
 */
public class DeSerializeDemo {

    public static void main(String[] args) {

        Employee e = null;

        try {
            //反序列化的时候,路径要与序列化的时候的路径一致即可。
            FileInputStream fileIn = new FileInputStream("tmp/employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            e = (Employee) in.readObject();
            in.close();
            fileIn.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
            return;
        } catch (ClassNotFoundException e1) {
            System.out.println("Employee class not found");
            e1.printStackTrace();
            return;
        }

        //当对象被序列化时,属性SSN的值为111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后Employee对象的SSN属性为0。
        //上面这段解释是资料上说的,现在还不是特别懂。

        System.out.println("DeSerialize Employee...");
        System.out.println("Name:"+e.name);
        System.out.println("Address:"+e.address);
        System.out.println("SSN:"+e.SSN);
        System.out.println("Number:"+e.number);

    }

}

四、程序运行效果

序列化

生成文件

反序列化

ok,结束。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值