序列化

Java序列化涉及类的序列化ID,作为版本标识确保跨应用数据传输成功。静态变量在序列化时不被保存。子类即使实现了序列化接口,父类非序列化时其属性将以默认值存在。使用`transient`关键字可阻止变量被序列化。自定义序列化和反序列化可通过实现`writeObject`和`readObject`方法来控制过程,但必须保持私有。多次序列化同一对象只会增加引用,而非重复写入属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,序列化id

/**
 * 单品表
 */
@Getter
@Setter
@ToString
public class Product extends BaseImgModel implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 单品id
     */
    @TableId(value = "product_id", type = IdType.AUTO)
    private Long productId;
    /**
     * 类别id
     */
    private Long categoryId;
    /**
     * 编码
     */
    private String code;
    /**
     * 产品类型:1成品,2包材,3辅材,4原料
     */
    private Byte type;
    /**
     * 单位
     */
    private String unit;

    /**
     * 是否测试: 1是0否
     */
    private Byte isTest;
}

在我们开发中的实体类,经常可以看到这么一段代码:

private static final long serialVersionUID = 1L;

这个序列化的UID有什么呢?

它相当于这个类的版本号,或者说是唯一标识。

两个应用程序之间,在传输数据的时候通过序列化来格式化类,那么两个应用程序中,类的序列化UID必须相同,否则就会序列化失败。

 

二,静态变量

序列化保存的是对象的状态,静态变量属于类的状态。也就是说,在序列化的过程中,静态变量是不会被序列化的。

 

三,子类的序列化

如果父类没有实现序列化接口,子类实现了序列化接口,那么当反序列化子类的时候,父类的属性有值吗?

父类的属性也会有值,只不过是基本数据类型的初始值。int的话是0,string是null。

如果也想一起序列化父类,要不就父类也实现序列化接口,要不就在父类里定义一个默认的无参构造方法来设置属性的初始化。

因为在反序列化子类的时候,也会先序列化父类,调用父类的无参构造方法。

 

四,transient关键字

Transient关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient变量的值被设为初始值,如int型的是0,对象型的是 null。

 

 

五,自定义序列化和反序列化

在序列化和反序列化的过程,实际上,jvm会试图调用类里边的writeObject和readObject方法,如果没有这两个方法,那么默认调用是ObjectOutputStream的defaultWriteObject方法以及ObjectInputStream的defaultReadObject方法。

所以我们完全可以通过自己实现writeObject和ReadObject方法来控制序列化过程。注意,这两个方法必须是private void的,否则会报错。

 

六,多次序列化对象

多次序列化同一个类的时候,并不会多次写入类属性到存储文件里,它只会保存多一份引用。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值