Java中的序列化和反序列化的细节处理问题

1、使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常


2、序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了


3、 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?会出问题,会抛出InvalidclassException异常解决方案:给Javabean类添加serialVersionUID(列号、版本号)


4、如果一个对象中的某个成员变量的值不想被序列化又该如何实现呢?该关键字标记的成员变量不参与序列化过程解决方案:给该成员变量加transient关键字修饰

大家可以拿着下面的代码自己去运行一下看看对应文件是否序列化成功

package com.objectStream;
import java.io.Serial;
import java.io.Serializable;


/**
 * @author helloZZ
 */

public class User implements Serializable {

    @Serial
    private static final long serialVersionUID = -7887220945484575938L;
    private String name;

   private int age;

   private transient String address;

    public User() {
    }

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

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

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

    /**
     * 获取
     * @return address
     */
    public String getAddress() {
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(String address) {
        this.address = address;
    }
}

package com.objectStream;

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

// 对象序列化
public class Test01 {
    public static void main(String[] args) throws IOException {
        User user1 = new User("张三",23,"四川省成都市");
        User user2 = new User("李四",22,"四川省成都市");
        User user3 = new User("王五",21,"四川省成都市");

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\Stream\\test.txt"));

        ArrayList<User> arrayList = new ArrayList<>();
        arrayList.add(user1);
        arrayList.add(user2);
        arrayList.add(user3);

        oos.writeObject(arrayList);
        oos.close();
    }
}




package com.objectStream;

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

// 对象反序列化
public class Test02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\Stream\\test.txt"));

        ArrayList<User> list = (ArrayList<User>) ois.readObject();
        for(User user:list){
            System.out.println(user);
        }
        ois.close();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仔仔 v1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值