• Java序列化有什么作用


    一、作用

    对java对象进行序列化之后,会变成字节码,这样就会比较方便在网络上进行传输,也可以在磁盘上进行存储。

    序列化:把Java对象转换为字节序列。
    反序列化:把字节序列恢复为原先的Java对象。

    二、为什么没有被序列化的对象,也能进行传输

    代码如下:

    public class DbmDB2Info {
    
    	//服务器信息
    	private Integer serverId;
    	private String serverName;
    	//主机信息
    	private String hostName;
    	private String hostIp;
    	private String osType;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    原因就是:在声明变量的时候,例如String、int、Boolean等时,数据类型已经实现了序列化
    可以看一下源码:String类型本身就已经实现了Serializable序列化接口

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、序列化的方式

    java对象需要进行序列化,可以实现下面两个接口中的一个:
    
    Serializable 接口
    Externalizable 接口
    
    • 1
    • 2
    • 3
    • 4

    1、Serializable 接口

    一个对象想要被序列化,那么它的类就要实现此接口或者它的子接口。

    这个对象的所有属性(包括private属性、包括其引用的对象)都可以被序列化和反序列化来保存、传递。

    不想序列化的字段可以使用transient修饰。

    由于Serializable对象完全以它存储的二进制位为基础来构造,因此并不会调用任何构造函数,因此Serializable类无需默认构造函数,但是当Serializable类的父类没有实现Serializable接口时,反序列化过程会调用父类的默认构造函数,因此该父类必需有默认构造函数,否则会抛异常。使用transient关键字阻止序列化虽然简单方便,但被它修饰的属性被完全隔离在序列化机制之外,导致了在反序列化时无法获取该属性的值,而通过在需要序列化的对象的Java类里加入writeObject()方法与readObject()方法可以控制如何序列化各属性,甚至完全不序列化某些属性或者加密序列化某些属性。

    2、Externalizable 接口

    它是Serializable接口的子类,用户要实现的writeExternal()和readExternal() 方法,用来决定如何序列化和反序列化。

    因为序列化和反序列化方法需要自己实现,因此可以指定序列化哪些属性,而transient在这里无效。

    对Externalizable对象反序列化时,会先调用类的无参构造方法,这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除,或者把该构造方法的访问权限设置为private、默认或protected级别,会抛出java.io.InvalidException: no valid constructor异常,因此Externalizable对象必须有默认构造函数,而且必需是public的。

  • 相关阅读:
    【计算机网络】运输层:拥塞控制
    Apache Doris 行列转换可以这样玩
    Vue-Router4 学习记录
    【原创】MybatisPlus调用原生SQL的三种方法
    C++ 变量的声明和初始化方式
    算法D38 | 动态规划1 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
    如何给R128在FreeRTOS下配置/data目录
    eggjs的mvc模式demo(纯静态)
    CAS:2590863-00-4;DPPD的理化性质
    async-rdma:使高性能网络应用开发更简单
  • 原文地址:https://blog.csdn.net/weixin_43860634/article/details/126846869