一文带你搞定序列化和反序列化

一、简介

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

**序列化作用:**在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

**反序列化作用:**根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

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

类 ObjectOutputStream的方法writeObject(Object x)用以序列化一个对象,并将它发送到输出流。

public final void writeObject(Object x) throws IOException

类 ObjectInputStream的方法readObject()用以反序列化一个对象,该方法从流中取出下一个对象,并且将对象放序列化,它的返回值为Object,因此你需要将它转换成合适的数据类型。

public final Object readObject() throws IOException,ClassNotFoundException

二、序列化示例

定义一个序列化的类,并且要实现Serializable接口

package com.jp.javaSE.序列化.序列化对象;

import java.io.Serializable;

/**
 * @program: mianjing
 * @description:
 * @author: 
 * @create: 2020-10-31 19:35
 **/
public class Employee implements Serializable {
    public String name;
    public String address;
    public transitransient int SSN;
    public int number;

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

序列化方法

package com.jp.javaSE.序列化.序列化对象;
import	java.io.ObjectOutputStream;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * @program: mianjing
 * @description: 序列化对象
 * @author: 
 * @create: 2020-10-31 19:40
 **/
public class SerializeDemo {
    public static void main(String[] args) {
        Employee e= new Employee();
        e.name="Reyan Ali";
        e.address="Phokka Kuan,Ambehtart Peer";
        e.SSN=11122333;
        e.number=10781;
        try {
            //该类用来创建一个文件并向文件中写数据。
            //如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
            FileOutputStream fileOut= new FileOutputStream("C:/2020_study/employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in /2020_study/employee.ser");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

三、序列化示例

注意:由于属性SSN的值为111222333,它是被transitransient修饰的,因此该值没有被发送到输出流,所以反序列化后Employee对象的SSN属性输出为0。

package com.jp.javaSE.序列化.反序列化对象;

import com.jp.javaSE.序列化.序列化对象.Employee;

import java.io.*;

/**
 * @program: mianjing
 * @description:
 * @author: 
 * @create: 2020-10-31 19:59
 **/
public class DeserializeDemo {
    public static void main(String[] args) {
        Employee e=null;
        try{
            FileInputStream fileIn= new FileInputStream("C:/2020_study/employeee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            //
            e=(Employee)in.readObject();
            in.close();
            fileIn.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            return;
        }catch (ClassNotFoundException c) {
            System.out.println("Employee class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized 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);
    }
}

结果输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值