java 序列化和反序列化

1什么是对象的序列化和反序列化:就是将对象写入文件和从文件中读取出来的过程。

         对象的序列化:ObjectOutputStream

        

 代码示例:

        1首先,我们把需要存储的对象,打一个标记,即Serializabale,只有对对象进行该操作后

        才可以进行序列化和反序列化

        

        2进行写入:

        

         对象的反序列化:ObjectIntputStream

        

 注意,使用时会有ClassNotFoundException异常,这个异常是指对象没有生成对应的class文件

                

         代码实现:

package com.bed.ObjectStream;

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

public class ObjectInput {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("day06-code\\ObjectOut.txt"));
        Object o = ois.readObject();
        ois.close();
        System.out.println(o);
    }

知识点:transiant(瞬态)关键字。它的作用和static一样,被transiant修饰的变量不能进行

              反序列化

知识点:InvalidClassException(序列化冲突)异常原理和解决方案

        原理:每次序列化的时候Serializable接口都都会对Person.class文件打上一个序列号,而我们

                  改动类的内容的时候,就会改变原有的序列号,而反序列化读取的时候会比较序列化和

                  反序列化的编号是否一样,就会发生序列号不同造成的冲突。

        解决方案:在类中自定义一个序列号即可(不让java自动生成序列号了)

如下写法即可:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

 案例:将多个对象进行序列化然后再进行反序列化。(注意其中的强转操作)

package com.bed.ObjectStream;

import java.io.*;
import java.util.ArrayList;

public class ObjectInandOut {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建一个数组用来存储Person类
        ArrayList<Person1> al1=new ArrayList<>();
        //向数组中添加数据。
        al1.add(new Person1("bed1",19));
        al1.add(new Person1("bed2",29));
        al1.add(new Person1("bed3",39));
        //将数组写入。序列化
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("day06-code\\InOut.txt"));
        oos.writeObject(al1);
        //进行反序列化。读取内容
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("day06-code\\InOut.txt"));
        Object o = ois.readObject();
        //将获得的o对象进行强转,转为ArraryList类型的数组
        ArrayList<Person1> al2=(ArrayList<Person1>)o;
        //遍历打印
        for (Person1 person1 : al2) {
            System.out.println(person1);
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值