序列化于反序列化

概念

序列化是指将对象的状态信息转换为可以存储或传输形式的过程,在序列化期间,对象将其当前的状态写入到临时或持久性存储区,之后可以通过从存储区中读取或者反序列化对象的状态,从而重新创建对象。

序列化:
利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节输出并持久保存在磁盘。

反序列化:
利用OjectInputStream,读取磁盘中序列化好的数据,重新恢复成对象。

特点

  1. 如果一个类的对象想要被序列化,那么这个类必须实现可序列化接口Serializable,用来启用序列化功能
  2. 不需要序列化的数据可以用static修饰,原因:static修饰的资源属于类资源,不会随着对象被序列化输出
  3. 不需要序列化的数据也可以用transient(临时的)修饰,只在程序运行期间在内存中存在,不会被序列化持久保存
  4. 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
  5. 在反序列化时,如果与序列化的版本号不一致,反序列化会失败
  6. 常用于服务器之间数据的传输,序列化成文件,反序列化读取数据
  7. 常用于使用套接字流在主机之间传递对象

序列化与反序列化的测试

准备一个类,用于序列化

package cn.tedu.serializable1;

import java.io.Serializable;

/*本类用来定义封装类Lover*/
/*如果本类的对象想要被序列化输出,必须实现可序列化接口Serializable*/
public class Lover implements Serializable {
	//定义属性并进行封装
    private String name;
    private int age;
    private String time;

    //无参构造
    public Lover() { }
    //全参构造
    public Lover(String name, int age, String time) {
        this.name = name;
        this.age = age;
        this.time = time;
    }

    //提供get和set 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
	//添加重写的toString(),因为不想看到地址值,想看属性与属性值
    @Override
    public String toString() {
        return "Lover{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", time='" + time + '\'' +
                '}';
    }
}

进行序列化与反序列化的测试

package cn.tedu.serializable1;

import java.io.*;

/*本类用于进行序列化和反序列化的测试*/
public class TestSerializable1 {
    public static void main(String[] args) {
        method1();//用于序列化
        method2();//用于反序列化
    }
	//本方法用于测试序列化
    private static void method2() {
        ObjectInputStream in = null;
        try {
            in = new ObjectInputStream(new FileInputStream("D:\\ready\\1.txt"));
            Object o = in.readObject();
            System.out.println(o);
            System.out.println("恭喜您!反序列化成功");
        }catch (Exception e){
            System.out.println("很抱歉,反序列化失败");
            e.printStackTrace();
        }finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //本方法用来测试序列化
    private static void method1() {
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(new FileOutputStream("D:\\ready\\1.txt"));
            Lover person = new Lover("刘佳鑫",23,"初中");
            out.writeObject(person);
            out.writeObject(person2);
            System.out.println("恭喜您!序列化成功");
        }catch (Exception e){
            System.out.println("很抱歉,序列化失败");
            e.printStackTrace();
        }finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值