• 字节流和处理流的对象反序列化问题


    细节:

    1. 读写要保持一致

    2. 序列对象时,默认将里面的所有属性都进行序列化,但除了static或transient修饰的成员

    3. 要求序列化或反序列化对象,需要实现Serializable

    4. 序列化对象时,要求里面的属性也要实现序列化接口

    5. 序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。

     输入流:将数据写入文件,data.dat中,使用反序列化手段,将数据打印到控制台上:

    1. public class ObjectOutputStream_ {
    2. public static void main(String[] args) throws IOException {
    3. //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保持
    4. String filePath = "E:\\data.dat";
    5. ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(filePath));
    6. //序列化数据 e:\data.dat
    7. oos.writeInt(100);// int -> Integer(实现了 Serializable)
    8. oos.writeBoolean(true); // boolean --> Boolean(实现了 Serializable)
    9. oos.writeChar('a'); //char --> Character (实现了 Serializable)
    10. oos.writeDouble(5.9); //double --> Double (实现了 Serializable)
    11. oos.writeUTF("Monian is studying Java!");//String (实现了 Serializable)
    12. oos.writeObject(new Dog("汤米",8));
    13. oos.close();
    14. System.out.println("数据保存完毕(序列化)~");
    15. }
    16. }

     反序列化手段打印到控制台上的代码如下:

    1. public class ObjectInputStream_ {
    2. public static void main(String[] args) throws IOException, ClassNotFoundException {
    3. //指定反序列化的文件
    4. String filePath = "E:\\data.dat";
    5. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
    6. /**
    7. * 1.读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
    8. * 2.否则会出现异常
    9. */
    10. System.out.println(ois.readInt());
    11. System.out.println(ois.readBoolean());
    12. System.out.println(ois.readChar());
    13. System.out.println(ois.readDouble());
    14. System.out.println(ois.readUTF());
    15. //dog 的编译类型
    16. Object o = ois.readObject();
    17. System.out.println("dog的运行类型="+o.getClass());
    18. System.out.println("dog的信息="+o);
    19. /**
    20. * 1.如果我们希望调用 Dog方法 ,需要向下转型
    21. * 2.需要我们交Dog类的定义 ,拷贝到可以引用的位置
    22. * Dog dog = (Dog) o;
    23. */
    24. Dog dog = (Dog) o;
    25. System.out.println("dog.name="+dog.getName());
    26. //关闭流,关闭外层流即可,底层会关闭FileInputStream 流
    27. ois.close();
    28. System.out.println("数据(反序列化)打印完毕~");
    29. }
    30. }

     这里一定要注意;当对对象进行操作的时候一定要注意,将对象类,实现Serializable接口,并且做成公共类,这样才能保证,反序列化的对象保持一致;输出时,输出的类型顺序也要原样输出

    1. import java.io.Serializable;
    2. public class Dog implements Serializable {
    3. private String name;
    4. private int age;
    5. @Override
    6. public String toString() {
    7. return "Dog{" +
    8. "name='" + name + '\'' +
    9. ", age=" + age +
    10. '}';
    11. }
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. public int getAge() {
    19. return age;
    20. }
    21. public void setAge(int age) {
    22. this.age = age;
    23. }
    24. public Dog(String name, int age) {
    25. this.name = name;
    26. this.age = age;
    27. }
    28. }

    打印结果:

     注意:当内容更改时,需要重新运行输入流,输出流才能输出,否则就会报错

  • 相关阅读:
    北方工业大学计算机考研资料汇总
    动态规划矩阵连乘算法(C/C++)
    基于springboot+Vue的学生实践管理平台开发
    springcloud17:stream消息驱动
    基于FPGA的DDS任意波形输出
    苹果电脑提高工作效率alfred 5中文
    中英文域名,你是否也有点小迷糊......
    Java HashMap源码学习
    期末作业C#实现学生宿舍管理系统
    php初级教程四 文件上传
  • 原文地址:https://blog.csdn.net/qq_58341172/article/details/134078844