• Serializable_序列化详情


     概述

    Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

    反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据对象的类型对象中存储的数据信息,都可以用来在内存中创建对象。

    1.序列化和反序列化的定义:

       (1).Java序列化就是指把Java对象转换为字节序列的过程。

            (2). Java反序列化就是指把字节序列恢复为Java对象的过程。

    2.Java实现序列化和反序列化的过程:

       (1). java.io.ObjectInputStream:对象输入流。

              该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

          (2). java.io.ObjectOutputStream:对象输出流。

              该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

    3.实现序列化和反序列化的三种实现:

    ①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。

    • ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。 
    • ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。

    ②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

    •  ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。 
    •  ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

    ③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

    •  ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。 
    •  ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

    4.序列化和反序列化代码示例

    public class SerializableTest {
            public static void main(String[] args) throws IOException, ClassNotFoundException {
                //序列化
                FileOutputStream fos = new FileOutputStream("object.out");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                Student student1 = new Student("lihao", "wjwlh", "21");
                oos.writeObject(student1);
                oos.flush();
                oos.close();
                //反序列化
                FileInputStream fis = new FileInputStream("object.out");
                ObjectInputStream ois = new ObjectInputStream(fis);
                Student student2 = (Student) ois.readObject();
                System.out.println(student2.getUserName()+ " " +
                        student2.getPassword() + " " + student2.getYear());
        }
     
    }
    public class GirlFriend implements Serializable {
        private String gender;
        private String isAlive;
        private String isBeautiful;
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public String getIsAlive() {
            return isAlive;
        }
    
        public void setIsAlive(String isAlive) {
            this.isAlive = isAlive;
        }
    
        public String getIsBeautiful() {
            return isBeautiful;
        }
    
        public void setIsBeautiful(String isBeautiful) {
            this.isBeautiful = isBeautiful;
        }

    Ø序列化示图

    Ø反序列化示图

    5.序列化和反序列化的注意点:

    1. 序列化时,只对对象的状态进行保存,而不管对象的方法。
    2. 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
    3. 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
    4. 声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。
    5. Java有很多基础类已经实现了serializable接口,比如String,Vector等。但是也有一些没有实现serializable接口的。

    心得:

       生如蝼蚁当立鸿鹄之志;

       命薄似纸应有不屈之心;

       乾坤未定;

       你我皆是黑马。

  • 相关阅读:
    WebStorm 常用功能的使用技巧分享
    Android开发-之数据的存储方式一
    C#泛型方法解析
    Vuex2.0+Vue2.0构建备忘录应用实践
    Android Studio快速开发之道
    深入jQuery中的data()
    Django---->模板层(template)
    初识DJango——MTV模型
    初识DJango——Web框架
    Offcanvas 自适应窗口示例
  • 原文地址:https://www.cnblogs.com/dyywht/p/13601763.html
Copyright © 2020-2023  润新知