序列化04transient关键字瞬态关键字InvalidClassException异常原理

12次阅读

共计 1166 个字符,预计需要花费 3 分钟才能阅读完成。

package com.itheima.demo04.ObjectStream;

import java.io.Serializable;

/*

 序列化和反序列化的时候, 会抛出 NotSerializableException 没有序列化异常
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。Serializable 接口也叫标记型接口
    要进行序列化和反序列化的类必须实现 Serializable 接口, 就会给类添加一个标记
    当我们进行序列化和反序列化的时候, 就会检测类上是否有这个标记
        有: 就可以序列化和反序列化
        没有: 就会抛出 NotSerializableException 异常
去市场买肉 --> 肉上有一个蓝色章 (检测合格)--> 放心购买 --> 买回来怎么吃随意


static 关键字: 静态关键字
    静态优先于非静态加载到内存中 (静态优先于对象进入到内存中)
    被 static 修饰的成员变量不能被序列化的, 序列化的都是对象
    private static int age;
    oos.writeObject(new Person("小美女",18));
    Object o = ois.readObject();
    Person{name='小美女', age=0}

transient 关键字: 瞬态关键字
    被 transient 修饰成员变量, 不能被序列化
    private transient int age;
    oos.writeObject(new Person("小美女",18));
    Object o = ois.readObject();
    Person{name='小美女', age=0}

*/
public class Person implements Serializable{

private static final long serialVersionUID = 1L;
private String name;
//private static int age;
//private transient int age;
public int age;

public Person() {}

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

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", 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;}

}
序列号冲突的异常

正文完
 0