一,序列化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的,否则会报错。
六,多次序列化对象
多次序列化同一个类的时候,并不会多次写入类属性到存储文件里,它只会保存多一份引用。