栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

序列化和反序列化

序列化和反序列化

序列化:将对象转为字节序列的过程。

package com.jmh.ppp;



import java.io.*;

public class Dog implements Serializable {
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("dog.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Dog dog1 = new Dog("uzi", 1);
        oos.writeObject(dog1);
        oos.flush();
        oos.close();
    }
}

反序列化:将字节序列还原为对象的过程。

package com.jmh.ppp;



import java.io.*;

public class Dog implements Serializable {
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileOutputStream fos = new FileOutputStream("dog.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Dog dog1 = new Dog("uzi", 1);
        oos.writeObject(dog1);
        oos.flush();
        oos.close();
        FileInputStream fis = new FileInputStream("dog.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Dog student2 = (Dog) ois.readObject();
        System.out.println(student2.name + " " +
                student2.age);
    }
}

序列化和反序列化的作用:传递对象和保存对象时,保证对象的完整性和可传递性,以便在网络上传输和保存到本地上。反序列化通过序列化二进制流重建新的对象。

实现序列化:

1.实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)

2.序列化反序列化对象:

  • java.io.ObjectInputStream(对象输入流):输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
  • java.io.ObjectOutputStream(对象输出流):该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

注意事项:

  • 1.序列化时,只对对象的状态进行保存,而不管对象的方法

  • 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

  • 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

  • 不是所以的对象都能序列化:
    1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;
    2.资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现;

  • 声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号