zoukankan      html  css  js  c++  java
  • 【java学习笔记】序列化、反序列化

    序列化 是将对象的完整信息保存起来的过程(持久化)。    序列化流:ObjectOutputStream

    反序列化 是将对象进行还原的过程(反持久化)。               反序列化流:ObjectInputStream

    1.序列化

        ①一个对象想要被序列化,这个对象对应的类必须实现Serializable。Serializable接口中没有任何的方法和属性,仅仅用于标志这个类产生的对象可以被序列化。

        ②被static/transient关键字修饰的属性不会被序列化

        ③一个类在实现Serializable接口之后会默认添加一个属性serialVersionUID(版本号),默认是用private static final long 修饰,版本号的值会根据当前类中的属性和方法自动计算。一个对象在序列化的时候会把这个版本号一起序列化出去,反序列化的时候就会比较对象中的版本号和当前类的版本号是否一致---需要手动指定版本号,防止类产生微小改动的时候已经序列化的对象反序列化不回来。

        ④集合和大部分映射不能被序列化。

     1 import java.io.Serializable;
     2 
     3 public class Person implements Serializable {
     4     private static final long serialVersionUID = 1984254532934148317L;
     5 
     6     private String name;
     7     private int age;
     8     private char gender;
     9     private double weight;
    10     private transient String cloth; // transient关键字标记的成员变量不参与序列化过程
    11     public static String classroom;
    12 
    13     public String getName() {
    14         return name;
    15     }
    16 
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20 
    21     public int getAge() {
    22         return age;
    23     }
    24 
    25     public void setAge(int age) {
    26         this.age = age;
    27     }
    28 
    29     public String getCloth() {
    30         return cloth;
    31     }
    32 
    33     public void setCloth(String cloth) {
    34         this.cloth = cloth;
    35     }
    36 
    37     public char getGender() {
    38         return gender;
    39     }
    40 
    41     public void setGender(char gender) {
    42         this.gender = gender;
    43     }
    44 
    45     public double getWeight() {
    46         return weight;
    47     }
    48 
    49     public void setWeight(double weight) {
    50         this.weight = weight;
    51     }
    52 }
    Person implements Serializable
     1 import java.io.FileOutputStream;
     2 import java.io.ObjectOutputStream;
     3 
     4 public class ObjectOutputStreamDemo {
     5     public static void main(String[] args) throws Exception {
     6         Person p = new Person();
     7         p.setName("肉丝");
     8         p.setAge(3);
     9         p.setCloth("无");
    10 //      p.classroom = "604";
    11 
    12         // 创建序列化流
    13         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\p.data"));
    14         // 写出对象
    15         out.writeObject(p);
    16         // 关流
    17         out.close();
    18     }
    19 }

    2.反序列化

     1 import java.io.FileInputStream;
     2 import java.io.ObjectInputStream;
     3 
     4 public class ObjectInputStreamDemo {
     5     public static void main(String[] args) throws Exception {
     6         // 创建反序列化流
     7         ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\p.data"));
     8         // 读取对象
     9         Person p = (Person) in.readObject();
    10         in.close();
    11         System.out.println(p.getName());
    12         System.out.println(p.getAge());
    13         System.out.println(p.getCloth());
    14 //      System.out.println(p.classroom);
    15     }
    16 }

    结果:

  • 相关阅读:
    Windows 命令提示符
    力扣 ——Linked List Cycle II(环形链表 II) python实现
    力扣——Linked List Cycle(环形链表) python实现
    力扣——Copy List with Random Pointer(复制带随机指针的链表) python实现
    力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
    剑指offer-链表中倒数第k个结点
    剑指offer-调整数组顺序使奇数位于偶数前面
    剑指offer-数值的整数方
    剑指offer-二进制中1的个数
    剑指offer-矩形覆盖
  • 原文地址:https://www.cnblogs.com/kuotian/p/8421923.html
Copyright © 2011-2022 走看看