• IO(四)----对象的序列化


    对象的序列化:   将内存中的对象直接写入到文件设备中。

    对象的反序列化: 将文件设备中持久化的数据转换为内存对象。

    自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行序列化和反序列化。从而来实现对象的持久化存储。

    对象的输入输出流 : 对象的输入输出流 主要的作用是用于写对象的信息与读取对象的信息。

    对象信息一旦写到文件上那么对象的信息就可以做到持久化存储了。
     
    对象的输出流: ObjectOutputStream

    常用方法:

    1、构造方法

    ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。

    2、写方法

    void writeObject(Object obj)  将指定的对象写入 ObjectOutputStream。 

    3、关闭资源方法

    void  close() 关闭流。
     
    对象的输入流: ObjectInputStream

    1、构造方法

    ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。

    2、读方法

    Object readObject() 从 ObjectInputStream 读取对象。

    3、关闭资源方法

    void  close() 关闭流。

    对象输入输出流要注意的细节:
         1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
         2. 对象的反序列化创建对象的时候并不会调用到构造方法的。
         3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
         4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
         5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。
         6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
         7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口。

    需求:存在两个类:用户类和地址类。用户类中有id,name,address,age属性。对用户类进行序列化和反序列化,并且不保存用户的年龄。

    代码示例:

     1 import java.io.FileInputStream;
     2 import java.io.FileOutputStream;
     3 import java.io.IOException;
     4 import java.io.ObjectInputStream;
     5 import java.io.ObjectOutputStream;
     6 import java.io.Serializable;
     7 
     8 class Address implements Serializable{
     9     private static final long serialVersionUID = 1L;
    10     int id;
    11     String detailAddress;
    12     public Address(int id, String detailAddress) {
    13         this.id = id;
    14         this.detailAddress = detailAddress;
    15     }
    16     @Override
    17     public String toString() {
    18         return "地址信息:  id"+this.id + "详细地址:"+this.detailAddress;
    19     }
    20 }
    21 
    22 class User implements Serializable{
    23     private static final long serialVersionUID = 1L;
    24     int id;
    25     String name;
    26     Address address;
    27     transient int age;
    28     public User(int id, String name, Address address, int age) {
    29         this.id = id;
    30         this.name = name;
    31         this.address = address;
    32         this.age = age;
    33     }
    34     @Override
    35     public String toString() {
    36         return "用户信息:   用户id:"+ this.id+"用户名:"+this.name +"  年龄"+this.age + this.address;
    37     }  
    38 }
    39 
    40 public class DemoObjectStream {
    41     public static void main(String[] args) throws IOException, ClassNotFoundException {
    42         
    43         //序列化
    44         User user = new User(123, "张三", new Address(110, "公安局"), 12);
    45         FileOutputStream fileOutputStream = new FileOutputStream("E:\nick.txt");
    46         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
    47         objectOutputStream.writeObject(user);
    48         objectOutputStream.close();
    49         //反序列化
    50         FileInputStream fileInputStream = new FileInputStream("E:\nick.txt");
    51         ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
    52         User user2 = (User)objectInputStream.readObject();
    53         System.out.println(user2);
    54         objectInputStream.close();
    55     }
    56 }
    View Code
  • 相关阅读:
    查看tls指纹
    并行流
    方法引入2
    方法引入
    Optional.ofNullable
    stream.filter
    stream.skip limit
    反射
    Optional orElseGet
    nginx 预压缩(gzip)
  • 原文地址:https://www.cnblogs.com/nicker/p/6253125.html
Copyright © 2020-2023  润新知