JavaSE(六):序列化流操作

 序列化流是一种高级流,作用是方便读写java中任何对象。

需要序列化的对象 

package com.wedu.io;

import java.io.Serializable;

/**
 * @description 序列化和反序列化需要实现Serializable接口,
 * @version JavaSE V1.0
 * @date 2019-09-22 11:33:40
 */
public class Person implements Serializable{

	//保证在序列化和反序列化时标记唯一不变
	private static final long serialVersionUID = 2471539698025636411L;
	
	private String name;
    private int age;

    public Person() {
    }

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

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

注意:

 1、需要序列化和反序列化的对象,需要实现Serializable接口。类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

2、被transient修饰成员变量,不能被序列化。

序列化和反序列化测试

package com.wedu.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

/**
 * @description 序列化和反序列化
 * @version JavaSE V1.0
 * @date 2019-09-22 11:46:52
 */
public class ObjectStream {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三",23));
        list.add(new Person("李四",25));
        list.add(new Person("王五",28));

        /**
         * 对象序列化,是将对象状态转换为二进制流数据;
         * void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。 
         */
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
        oos.writeObject(list);

        /**
         * 对象反序列化,是指把这种二进制流数据还原成对象。
         * Object readObject() 从 ObjectInputStream 读取对象。 
         */
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"));
        Object obj = ois.readObject();

        for (Person person : (ArrayList<Person>) obj) {
            System.out.println(person);
        }

        ois.close();
        oos.close();
	}
}

注意:

1、在反序列化时,对象类必须实现Serializable接口,如果没有实现标记接口,反序列化时会抛出NotSerializableException异常;

2、在反序列化时,对象不可重新编译,如果重新编译的话,有可能抛出InvalidClassException异常,因为在反序列化时,会比较当前的class文件中的序列号是否和序列化时的序列号一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值