• java IO流 序列化流


    java提供了一种序列化机制,一个字节序列可以表示为一个对象,相当于对象存储到文件中去了,具有持久化。反序列化,从字节序列文件里面把重构成对象。

    protectedObjectOutputStream()

    为完全重新实现ObjectOutputStream的子类提供一种方法,不必分配刚刚被ObjectOutputStream实现使用的私有数据。

     ObjectOutputStream(OutputStream out)

    创建一个写入指定的OutputStream的ObjectOutputStream。

    构造方法
    ModifierConstructor and Description
    protectedObjectInputStream()

    为完全重新实现ObjectInputStream的子类提供一种方法,不必分配刚刚被ObjectInputStream实现使用的私有数据。

     ObjectInputStream(InputStream in)

    创建从指定的InputStream读取的ObjectInputStream。

     序列化

    如果是序列化集合,集合元素的对象也需要实现Serializable接口

    1. public class Test {
    2. public static void main(String[] args) {
    3. /**
    4. * java.io.ObjectOutputStream类继承OutputStream,所以该类也表示字节输出流
    5. * 序列化操作:
    6. * void writeObject(Object obj)
    7. * 将指定的对象写入ObjectOutputStream。
    8. * 注意:
    9. * 被序列化的对象必须实现Serializable接口
    10. */
    11. Student zhangsan = new Student("张三", 18);
    12. try (
    13. ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("IO流\\aaa\\zhangsan.txt"));
    14. ){
    15. objectOutputStream.writeObject(zhangsan);
    16. } catch (FileNotFoundException e) {
    17. e.printStackTrace();
    18. } catch (IOException e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }

    反序列化

    注意事项:

    1,对于jvm可以反序列化对象,它是必须要能找到class文件的类(在项目下的out目录下面)

    2,能找到class文件的类,但是class文件在序列化对象后发生了修改,那么也会报异常。

    我们在序列化的时候,会自动生成一个序列化id。如何解决呢?在属性中加上static final long serialVersionUID = 42L;

    这样如果对象文件改了,还是会用原来的对象反序列化。

    1. public class Test2 {
    2. /**
    3. * 反序列化
    4. * Object readObject()
    5. * 从ObjectInputStream读取一个对象。
    6. */
    7. public static void main(String[] args) {
    8. try (
    9. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("IO流\\aaa\\zhangsan.txt"));
    10. ){
    11. Student zhangsan = (Student)objectInputStream.readObject();
    12. System.out.println(zhangsan.getName());
    13. } catch (IOException | ClassNotFoundException e) {
    14. e.printStackTrace();
    15. }
    16. }
    17. }

    如果一个对象的属性不想被序列化,那么就使用transient关键字标明为瞬态。如下,这个时候我们反序列化后,获取age属性,发现值是默认值null

    1. public class Student implements Serializable {
    2. private String name;
    3. private transient Integer age;
    4. public Student() { }
    5. public Student(String name, Integer age) {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. @Override
    10. public boolean equals(Object o) {
    11. if (this == o) return true;
    12. if (o == null || getClass() != o.getClass()) return false;
    13. Student student = (Student) o;
    14. return Objects.equals(name, student.name) && Objects.equals(age, student.age);
    15. }
    16. @Override
    17. public int hashCode() {
    18. return Objects.hash(name, age);
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public void setAge(Integer age) {
    24. this.age = age;
    25. }
    26. public String getName() {
    27. return name;
    28. }
    29. public Integer getAge() {
    30. return age;
    31. }
    32. @Override
    33. public String toString() {
    34. return "Student{" +
    35. "name='" + name + '\'' +
    36. ", age=" + age +
    37. '}';
    38. }
    39. }

  • 相关阅读:
    docker之Harbor私有仓库
    @pytest.mark.dependency依赖跨模块时,当前测试方法自动被跳过
    百度SEO优化的特点(方式及排名诀窍详解)
    tcp连接 三次握手、四次挥手
    使用 OpenCV 构建文档扫描仪
    (六)笔记.net core学习之泛型、逆变/协变、泛型缓存
    2022-07-28
    【 云原生 | K8S 】kubectl 详解
    一文读懂Python异常
    rabbitMQ学习-延迟队列
  • 原文地址:https://blog.csdn.net/qq_42572322/article/details/125610606