序列化-将java对象转换为字节对象
Serializable实现
dubbo服务在调用的时候,传输的实体必须要实现序列化
java.lang.IllegalStateException: Serialized class com.c4tman.mock.provider.dubbo.dto.Person
must implement java.io.Serializable
transient关键字修饰的属性,会用默认值,不会被序列化。
如果父类实现了Serializable接口,子类没有实现Serializable接口,那么子类可以正常序列化。
如果子类实现了Serializable接口,而父类没有实现Serializable接口,那么必须满足如下条件子类才能正常序列化,
第一:父类必须提供一个公共的无参默认构造函数
使用gson时,没有无参构造也可以
Externalizable实现
需要序列化的对象必须有无参构造
需自行实现每个属性的序列化规则
静态属性不能被序列化,只会只用默认值
反序列化-将字节对象转换为java对象
dubbo传输实体无无参构造方法,也可以调用成功。
ObjectInputStream也可以成功,见鬼了吧~
一些常用的序列化工具
xml
json
protobuff
avro
lombok
注解在类上
@Data
提供get set equals canEqual hashCode toStrings一个6个方法
@Setter
所有属性的setter方法
@Getter
所有属性的getter方法
@ToString
生成toString方法
@Value
提供get equals hashCode toStrings一个4个方法
@
@Log4j
名为log的Log4j对象
@Log4j2
名为log的Log4j2 对象
@Slf4j
名为log的Slf4j 对象
@AllArgsConstructor
提供全参构造方法,使用此方法后,默认的构造方法(无参构造)将不再提供。
@NoArgsConstructor
提供无参构造方法。
@EqualsAndHashCode
提供equals canEqual hashCode方法
@Builder
只使用@Builder会自动创建全参构造器。默认
而添加上@NoArgsConstructor后就不会自动产生全参构造器
反序列化需要DTO实现无参构造方法
注解在属性上
@NonNull
属性不能为空,且默认有该属性的构造方法,无无参构造。
注解在变量上
@CleanUp
调用变量的close()方法。
注解再方法上
@SneakyThrows(Exception.class)
整个方法抛出异常