Java 序列化

Java 序列化

何谓序列化

Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

常规的对象,在程序结束后就会被回收处理,如果想要对象能被持久化保存下来方便下次使用,就需要使用到对象的序列化和反序列化。

  • 序列化: 对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。
  • 反序列化: 客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。

序列化成功的条件

  1. 该类必须实现 Java.io. Serializable接口。
  2. 类的所有属性必须是可序列化的(属性类型是实现类java.io. Serializable接口的)。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。

序列化排除某个字段

  • 只需要用 transient关键字修饰这个字段。

序列化和反序列化对象

ObjectOutputStream 类用来序列化一个对象,如下例子实例化了一个 Employee 对象,并将该对象序列化到一个文件中。

该程序执行后,就创建了一个名为 employee.ser 文件。

注意: 当序列化一个对象到文件时, 按照 Java 的标准约定是给文件一个 .ser 扩展名。

例子:

public class Employee implements java.io.Serializable
{
   
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
   
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}

序列化:

import java.io.*;
 
public class SerializeDemo
{
   
   public static void main(String [] args)
   {
   
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      try
      {
   
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      }catch(IOException i)
      {
   
          i.printStackTrace();
      }
   }
}

反序列化:

import java.io.*;
 
public class DeserializeDemo
{
   
   public static void main(String [] args)
   {
   
      Employee e = null;
      try
      {
   
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      }catch(IOException i)
      {
   
         i.printStackTrace();
         return;
      }catch(ClassNotFoundException c)
      {
   
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
    }
}

以上程序编译运行结果如下所示:

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

这里要注意以下要点:

readObject() 方法中的 try/catch代码块尝试捕获 ClassNotFoundException 异常。对于 JVM 可以反序列化对象,它必须是能够找到字节码的类。如果JVM在反序列化对象的过程中找不到该类,则抛出一个 ClassNotFoundException 异常。

注意,readObject() 方法的返回值被转化成 Employee 引用。

当对象被序列化时,属性 SSN 的值为 111222333,但是因为该属性是短暂的,该值没有被发送到输出流。所以反序列化后 Employee 对象的 SSN 属性为 0。

本文参考:https://www.runoob.com/java/java-serialization.html

详细内容可以参考:Java序列化,看这篇就够了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114428.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 详解自动编码器(AE)

    详解自动编码器(AE)自动编码器(Auto-Encoders,AE)降噪自编码(DenoisingAuto-Encoders,DAE)(2008)堆叠降燥自动编码器(StackedDenoisingAuto-Encoders,SAE)(2008)卷积自动编码器(ConvolutionAuto-Encoders,CAE)(2011)变分自动编码器(VariationalAuto-Encoders,VAE)(Kingma,2014)

    2022年5月1日
    108
  • 数据挖掘算法和实际应用案例

    数据挖掘算法和实际应用案例第一次写博客,这次主要引用Little_Rookie大佬的一篇博客,主要来说明一下数据挖掘的主要算法和分类,以及实际生活中的应用案例,同时也是为了方便自己以后的学习。如何分辨出垃圾邮件”、“如何判断一笔交易是否属于欺诈”、“如何判断红酒的品质和档次”、“扫描王是如何做到文字识别的”、“如何判断佚名的著作是否出自某位名家之手”、“如何判断一个细胞是否属于肿瘤细胞”等等,这些问题似乎都很专业,都…

    2022年6月16日
    30
  • C51单片机LCD1602驱动程序

    C51单片机LCD1602驱动程序C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作一、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图LCD1602简介LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个57或者510的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此

    2022年7月16日
    13
  • BeanCopier 详解「建议收藏」

    BeanCopier 详解「建议收藏」 BeanCopier实现属性拷贝的主要代码: BeanCopierbeanCopier=BeanCopier.create(dad.getClass(),dadly.getClass(),false); beanCopier.copy(dad,dadly,null);  查看BeanCopier源码可知: abstractpublicclass…

    2022年9月5日
    2
  • 嵌入式–接口(一)Camera接口:DVP、MIPI[通俗易懂]

    嵌入式–接口(一)Camera接口:DVP、MIPI[通俗易懂]目录DVP接口LVDS接口MIPI接口CSI接口DVP接口sensor接口之DVP DVP(DigitalVideoPort)是传统的sensor输出接口,采用并行输出方式,d数据位宽有8bit、10bit、12bit、16bit,是CMOS电平信号(重点是非差分信号),PCLK最大速率为96MHz,接口如下图:PCLK:pixelclock,像素时钟,每个时钟对应一个像素数据;HSYNC:horizonalsynchronization,行同步信号VSYNC:vertical

    2022年5月9日
    449
  • ForkJoin使用「建议收藏」

    ForkJoin使用「建议收藏」Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情:  1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割  2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队…

    2022年9月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号