zoukankan      html  css  js  c++  java
  • java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream

      ObjectOutputStream Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream

    读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

      注意:只能将支持 java.io.Serializable 接口的对象写入流中

      用于从流中读取对象的

      操作流 ObjectInputStream    称为 反序列化流

      用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

      特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

     

    public class ObjectStreamDemo {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            /*
             * 将一个对象存储到持久化(硬盘)的设备上。
             */
            writeObj();//对象的序列化。
        }
        public static void writeObj() throws IOException {
            //1,明确存储对象的文件。
            FileOutputStream fos = new FileOutputStream("tempfile\obj.object");
            //2,给操作文件对象加入写入对象功能。
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //3,调用了写入对象的方法。
            oos.writeObject(new Person("wangcai",20));
            //关闭资源。
            oos.close();
        }
    }
    public class Person implements Serializable {
        private String name;
        private int age;
        public Person() {
            super();
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }

    二 对象反序列化流ObjectInputStream

      ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。支持

    java.io.Serializable接口的对象才能从流读取。

    public class ObjectStreamDemo {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            readObj();//对象的反序列化。
        }
        public static void readObj() throws IOException, ClassNotFoundException {
            
            //1,定义流对象关联存储了对象文件。
            FileInputStream fis = new FileInputStream("tempfile\obj.object");
            
            //2,建立用于读取对象的功能对象。
            ObjectInputStream ois = new ObjectInputStream(fis);
            
            Person obj = (Person)ois.readObject();
            
            System.out.println(obj.toString());
            
        }
    }

    三 序列化接口

      当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException

    异常。

      同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常

    InvalidClassException。发生这个异常的原因如下:

      该类的序列版本号与从流中读取的类描述符的版本号不匹配

      该类包含未知数据类型

      该类没有可访问的无参数构造方法

      Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于

    验证序列化的对象和对应类是否版本匹配。

       代码修改如下,修改后再次写入对象,读取对象测试

    public class Person implements Serializable {
        //给类显示声明一个序列版本号。
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
        public Person() {
            super();
            
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }

    四 瞬态关键字transient

      当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。

    只要被transient修饰了,序列化时这个属性就不会序列化了。

      同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

      代码修改如下,修改后再次写入对象,读取对象测试

    public class Person implements Serializable {
        /*
         * 给类显示声明一个序列版本号。
         */
        private static final long serialVersionUID = 1L;
        private static String name;
        private transient/*瞬态*/ int age;
        
        public Person() {
            super();
            
        }
        
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }
  • 相关阅读:
    第6 章 : 应用编排与管理:Deployment
    第5 章 : 应用编排与管理:核心原理
    第4 章 : 理解 Pod 和容器设计模式
    第3 章 : Kubernetes 核心概念
    第2 章 : 容器基本概念
    第1 章 : 第一堂“云原生”课
    阿里云原生技术公开课程-讲师记录及视频链接
    Shell中的(),{}几种语法用法-单独总结
    折腾kubernetes各种问题汇总-<1>
    Kubernetes中Deployment部署故障排除
  • 原文地址:https://www.cnblogs.com/jiejava/p/13450239.html
Copyright © 2011-2022 走看看