序列化相关面试题

x33g5p2x  于2022-02-07 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(301)

Serializable接口为什么需要定义serialVersionUID常量

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException

什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?

  1. 序列化:把对象转化为字节序列的过程称为对象的序列化

  2. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化

  3. JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定:

  4. 被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。

  5. 为了保持序列化过程的稳定,建议在类中添加序列化版本号。

  6. 不想让字段放在硬盘上就加transient

  7. 以下情况需要使用 Java 序列化:

  8. 想把内存中的对象状态保存到一个文件中或者数据库中时候;

  9. 想用套接字在网络上传送对象的时候;

  10. 想通过RMI(远程方法调用)传输对象的时候。

什么是序列化?

序列化:把对象转化为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化

为什么序列化?

  • 持久存储时
  • 网络传输时
  • 通过RMI传输对象时(RMI(Remote Method Invocation,远程方法调用))

怎么序列化?

实现方式:实现Serializable接口

序列化知识点

  • transient(短暂的、临时的)修饰的属性,不会被序列化
  • 静态static修饰的属性不能被序列化
  • 当属性是对象时,该对象属性对应的类也要实现Serializable接口

测试代码

package 序列化;

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    static String XINGQIU = "地球";
    int age;
    String name;
//    String sex;
    transient String car;

    public static String getXINGQIU() {
        return XINGQIU;
    }

    public static void setXINGQIU(String XINGQIU) {
        Person.XINGQIU = XINGQIU;
    }

    public String getCar() {
        return car;
    }

    public void setCar(String car) {
        this.car = car;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

//    public String getSex() {
//        return sex;
//    }
//
//    public void setSex(String sex) {
//        this.sex = sex;
//    }

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

import java.io.*;

public class SeriableTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        serializePerson();
        Person person = deserilizePerson();
        System.out.println(person);
    }

    /**
     * 序列化
     * @throws IOException
     */
    public static void serializePerson() throws IOException {
        Person person = new Person();
        person.setCar("奥迪");
        person.setAge(22); person.setName("coderzpw");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("d:/test/person.txt")));
        oos.writeObject(person);
        System.out.println("person对象序列化成功!");
        oos.close();
    }

    /**
     * 反序列化
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static Person deserilizePerson() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/test/person.txt"));
        Person preson = (Person)ois.readObject();
        System.out.println("person反序列化成功!");
        ois.close();
        return preson;
    }
}

相关文章