• javase之序列化与反序列化


    先来说一下什么是序列化与反序列化?

    序列化:

            永久的保存对象,保存对象的字节序列到本地文件中

    反序列化:

            将保存到本地文件中的对象读取到内存中,还原成这个对象

    如何实现序列化与反序列化?

    一个类如果想被序列化,则必须实现java.io.Serializable接口,这个接口没有定义任何方法,是一个标志性接口,当一个类实现了该接口,就表示这个类的对象是可以被序列化的

    下面说一下序列化的时候,需要注意的问题

    1.当一个对象被序列化的时候,只保存对象的非静态成员变量,因为静态成员与方法是属于类的成员

    2.如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存

    3.如果一个可序列化对象包含了某个不可序列化对象的引用,那么整个序列化是会失败的,并且会抛出一个NotSerializableException,我们可以将这个引用标记为transient,表示为短暂的,此时该变量就无法被序列化,然后对象依旧可以被序列化

    下面介绍一下序列化与反序列化用到的两个对象与方法

    1.序列化对象与方法

      

     

    上面序列化是要把对象写出去,因此就要用到ObjectOutputStream流

    这里还需要说明一点的就是,序列化一般在外部存储文件,该文件的扩展名一般就叫.ser

    2.反序列化的对象与方法

      

     下面我们来看代码实例

    先来看我们需要序列化的一个类

    Person

    1. package domain;
    2. import java.io.Serializable;
    3. import java.util.Date;
    4. public class Person implements Serializable {
    5. String name;
    6. int age;
    7. String gender;
    8. //添加了一个短暂属性,表明这个字段不可别序列化
    9. transient Date birthday;
    10. public Date getBirthday() {
    11. return birthday;
    12. }
    13. public void setBirthday(Date birthday) {
    14. this.birthday = birthday;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public void setName(String name) {
    20. this.name = name;
    21. }
    22. public int getAge() {
    23. return age;
    24. }
    25. public void setAge(int age) {
    26. this.age = age;
    27. }
    28. public String getGender() {
    29. return gender;
    30. }
    31. public void setGender(String gender) {
    32. this.gender = gender;
    33. }
    34. }

    序列化类SerializeTest1.java

    1. package test;
    2. import domain.Person;
    3. import java.io.FileNotFoundException;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. import java.io.ObjectOutputStream;
    7. import java.util.Date;
    8. public class SerializeTest1 {
    9. public static void main(String[] args) throws IOException {
    10. Person p = new Person();
    11. p.setName("王二麻子");
    12. p.setAge(520);
    13. p.setGender("男");
    14. p.setBirthday(new Date());
    15. //建立一个序列化对象
    16. FileOutputStream fis = new FileOutputStream("D:/w.ser");
    17. ObjectOutputStream oos = new ObjectOutputStream(fis);
    18. oos.writeObject(p);
    19. oos.close();
    20. fis.close();
    21. }
    22. }

    这个就会在指定位置给我们产生一个文件

     

    但是你不要打开这个看啊,因为这个肯定是乱码,毕竟是一个序列化文件,属于正常情况

    然后去看我们的反序列化文件Deserialize.java

    1. package test;
    2. import domain.Person;
    3. import java.io.*;
    4. public class DeserializeTest1 {
    5. public static void main(String[] args) {
    6. //将文件进行反序列化
    7. Person p = null;
    8. //建立一个反序列化对象
    9. //这里是.ser序列化的文件
    10. FileInputStream fis = null;
    11. ObjectInputStream objectInputStream = null;
    12. try {
    13. fis = new FileInputStream("D:/w.ser");
    14. objectInputStream = new ObjectInputStream(fis);
    15. p = (Person) objectInputStream.readObject();
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. }finally{
    19. try {
    20. objectInputStream.close();
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. } finally {
    24. try {
    25. fis.close();
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. }
    31. //上面就会反序列化之前我们在文件中存放的对象
    32. //然后访问一下之前创建的对象
    33. System.out.println("Name: " + p.getName());
    34. System.out.println("age: " + p.getAge());
    35. System.out.println("gender: " + p.getGender());
    36. System.out.println("birthday: " + p.getBirthday());
    37. }
    38. }

     运行结果:

    这里在说一下为什么birthday是NULL,不是之前设置了值吗?你忘啦,我们添加了transient短暂属性,所以它不会被序列化的。

    再见。 

  • 相关阅读:
    【Datawhale X 魔搭 】AI夏令营第四期AIGC方向,Task1:可图Kolors-LoRA风格AI图片生成入门(持续更新)
    【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表
    嵌入式系统开发笔记106:发光二极管间隔闪烁
    Elasticsearch REST API 初探:索引与搜索文档的奥秘
    三门问题 代码验证概率
    cuda总结
    WebSocket Day02 : 握手连接
    微服务01-基本介绍+注册中心EureKa
    Mathorcup数学建模竞赛第二届-【妈妈杯】B题:公司业务数据分析(附带赛题解析&获奖论文及MATLAB代码)
    【Windows】安装Microsoft Store,Microsoft Store离线包
  • 原文地址:https://blog.csdn.net/Pxx520Tangtian/article/details/126245598