序列化和反序列化

序列化和反序列的理解

序列化和反序列化的理解

序列化的实现

参与序列化和反序列的对象必须实现Serializable接口

Serializable接口只是一个标志接口(这个接口中什么代码都没有),

起到标志的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇,

每个实现序列化接口的类中都会有一个序列化版本号

 * @see java.io.ObjectOutputStream   //对象输出流 将文件从内存中序列化到硬盘中
 * @see java.io.ObjectInputStream   //对象输入流  将硬盘中的文件反序列化到内存中
 * @see java.io.ObjectOutput
 * @see java.io.ObjectInput
 * @see java.io.Externalizable
 * @since   JDK1.1
 */
public interface Serializable {
}

public static void main(String[] args) throws  Exception {

     //这个对像需要实现序列化接口(标志作用)
    Student student = new Student(111, 22); 
    //序列化
    ObjectOutputStream  oos=new ObjectOutputStream(new FileOutputStream("student"));
    //从内存中序列化到硬盘中
    oos.writeObject(student);
    oos.flush();
    oos.close();
}

反序列化

反序列化时 序列化的序列化id和反序列的ID要一致

 /*
    *  反序列化
    * */
    public static void main(String[] args)  throws  Exception{

        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("student"));

        Object object = ois.readObject();

        System.out.println(object);
        ois.close();
    }

一次序列化多个对象

​ 参与序列化的ArrayList集合中以及集合中的元素User都需要实现java.io.Serializable

package com.aaa.javase.pojo;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/*
*  序列化多个对像
* */
public class ObjectArrayListTest {
    public static void main(String[] args) throws Exception {
        List<User> list=new ArrayList<>();
        list.add(new User(1,"张三"));
        list.add(new User(2,"李四"));
        list.add(new User(3,"王五"));

        //开始序列化

        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("user"));

        oos.writeObject(list);

        oos.flush();
        oos.close();
    }
}

反序列化多个对象

/*
*  反序列化
* */
public class ObjectInputArrayListTest {

    public static void main(String[] args)  throws  Exception{

        //反序列化
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("user"));
        //因为知道这个序列化是List集合所以可以进行
        //强制类型转换
        List<User> object = (List<User>) ois.readObject();
        for (User user : object) {
            System.out.println(user);
        }
        ois.close();
}

transient关键字的使用

​ transient 关键字表示游离的,不参与序列化

只要有这个关键字修饰的字段都不参与序列化

  private  transient String name;

关于序列化版本号

IDEA中生成序列化版本号

在IDEA中 file ->Editor->Inspections下
设置序列化版本号的生成

//在实现序列化的类中的添加序列化版本号,这个序列化版本号
//具有全球唯一性
//可以使用IDEA工具生成,也可以自己写
private static final long serialVersionUID = 5864733701950787406L;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值