对象的序列化和反序列化

谁践踏了优雅 2022-09-12 12:53 319阅读 0赞

什么是序列化?
为了把对象的成员属性和成员方法进行持久化的保存,需要把对象转换为字节序列,以便于存储,这个过程就叫序列化。

反之,反序列化就是把字节序列恢复成对象。

  1. 实现序列化的对象需要实现一个标记接口,并且给这个添加一个Long类型的标记

    Serializable 这个接口里面没有任何东西,只是作为一个标记
    private static final long serialVersionUID = 1L;常量,默认设置为1L

当我们进行序列化和反序列化时就会检测该类上面是否有这个标记,没有会抛出异常 NotSerializableException

  1. 使用ObjectOutputStreamwriteObject()方法写入对象

    public class ObjectOutputStream

    1. extends OutputStream implements ObjectOutput, ObjectStreamConstants{
    2. }

该类继承了字节流的输出流OutputStream

  1. 要读取时,使用ObjectInputStream类的readObject()方法

    public class ObjectInputStream

    1. extends InputStream implements ObjectInput, ObjectStreamConstants

    { }

该类继承字节流的输入流InputStream

  1. package com.study.SerializableImpl;
  2. import java.io.Serializable;
  3. /** * @Description 实现对象序列化 * @Date 2021/9/12 13:09 * @Created by 折腾的小飞 */
  4. public class Student implements Serializable {
  5. private static final long serialVersionUID = 1L;
  6. private String name;
  7. private Integer age;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public Integer getAge() {
  15. return age;
  16. }
  17. public void setAge(Integer age) {
  18. this.age = age;
  19. }
  20. public Student() {
  21. }
  22. public Student(String name, Integer age) {
  23. this.name = name;
  24. this.age = age;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Student{" +
  29. "name='" + name + '\'' +
  30. ", age=" + age +
  31. '}';
  32. }
  33. }
  34. package com.study.SerializableImpl;
  35. import java.io.*;
  36. import java.util.ArrayList;
  37. import java.util.Arrays;
  38. import java.util.List;
  39. /** * @Description 3种方法实现对象的反序列化 * @Date 2021/9/12 14:23 * @Created by 折腾的小飞 */
  40. public class StudentSerializable {
  41. public static void main(String[] args) {
  42. Student stu = new Student("胡梓卓", 22);
  43. Student stu1 = new Student("涂鏊飞", 21);
  44. Student[] stus = { stu, stu1};
  45. try {
  46. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("./stu.txt")));
  47. /*oos.writeObject(stus); // 写入一个对象数组 oos.flush();*/
  48. // 遍历写入单个对象
  49. /*for (Student student : stus) { oos.writeObject(student); oos.flush(); } oos.writeObject(null);*/
  50. for (Student student : stus) {
  51. oos.writeObject(student);
  52. oos.flush();
  53. }
  54. System.out.println("对象序列化成功");
  55. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("./stu.txt"));
  56. // 存入文件时,将几个对象放入一个Object[] 数组中,然后再读取。
  57. /*Object[] arrStu = (Object[]) ois.readObject(); for (Object o : arrStu) { System.out.println(o); }*/
  58. // 第二种方法,在写入时最后写入null
  59. /*Student s=null; while ((s= (Student) ois.readObject())!=null){ System.out.println(s); }*/
  60. // 用available判断是否达到了文件末尾
  61. /*Object obj = null; while (ois.available() > 0) { obj = ois.readObject(); System.out.println(obj); }*/
  62. /*System.out.println(ois.available());*/
  63. System.out.println("对象反序列化成功");
  64. oos.close();
  65. ois.close();
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }

把两个对象stu和stu1写入文件stu.txt后,查看文件

  1. �� sr "com.study.SerializableImpl.Student L aget Ljava/lang/Integer;L namet Ljava/lang/String;xpsr java.lang.Integer⠤���8 I valuexr java.lang.Number������ xp t 胡梓卓sq ~ sq ~ t 涂鏊飞

发表评论

表情:
评论列表 (有 0 条评论,319人围观)

还没有评论,来说两句吧...

相关阅读

    相关 对象序列序列

    什么是序列化? 为了把对象的成员属性和成员方法进行持久化的保存,需要把对象转换为字节序列,以便于存储,这个过程就叫序列化。 反之,反序列化就是把字节序列恢复成对象。 1

    相关 对象序列序列

    当程序运行的时候,对象在内存中是存在的,一旦程序结束,那么该对象便从内存中“消失”,如果想实现对象的“持久化存储”,即保存在硬盘中呢?那么就需要通过对象的序列化来实现了;同理,