序列化与反序列化

序列化与反序列化

序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反之则为反序列化。

例如:在Java中,后台返回数据给前端,一般都将其转成 Json对象,这个把java对象转成 Json 对象的过程就是序列化。

妙用com.fasterxml.jackson.annotation.*系列注解

巧妙地利用com.fasterxml.jackson.annotation.*系列的注解可以在前后端交互数据时候,起到灵活转换的功效。

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-annotationsartifactId>
dependency>

@JsonProperty

用在一般属性上

@JsonProperty用在属性上时,在序列化的时候,会将属性名称序列化成指定的名称。

【示例】
有一个 Test 对象,含有两个Field,分别为fieldOnefileTwo

@Data
public class Test{
    private String fieldOne = "xxx";
    private String fileTwo = "yyy";
}

正常序列化:字段名相同

{"fieldOne":"xxx" , "fileTwo":"yyy"}

现在加上@JsonProperty注解

@Data
public class Test{
	@JsonProperty(value = "fieldThree") // 只有 value 属性可以省略 ("fieldThree")
    private String fieldOne;
    private String fileTwo;
}

序列化:这个时候可以看到序列化后fieldOne变成了fieldThree

{"fieldThree":"xxx" , "fileTwo":"yyy"}

常用属性:

  1. value:表示字段名称
  2. access:设置该字段的访问控制权限
    • JsonProperty.Access.WRITE_ONLY:表示这个字段只能被反序列化,序列化时会被限制访问
    • JsonProperty.Access.READ_ONLY:表示这个字段只能被序列化,反序列化时会限制访问

用在集合属性上

@JsonProperty用在集合属性上时,在序列化的时候,会copy一份集合以指定名称名称,也就是说序列化后会存在两个集合,一个原名的,一个指定命名的。两个集合除了名字不同其余都一样。

@JsonAlias

@JsonAlias用来指定字段的别名,在反序列化的时候,会轮流把指定的一个别名或多个别名的属性的值赋给这个字段,这个过程是重复赋值的过程
【示例】

@Data
public class Test{
    private String fieldOne;
    private String fileTwo;
}

Json对象:

{"fieldThree":"xxx" , "fileTwo":"yyy"}

因为Json对象没有fieldOne字段,所以反序列化时,是匹配不到java对象的fieldOne字段的。

若加上@JsonAlias("fieldThree")指定别名

@Data
public class Test{
	@JsonAlias("fieldThree")
    private String fieldOne;
    private String fileTwo;
}

这时候序列化就会把Json对象中的fieldThree字段匹配到Java对象的fieldOne字段。

另外,@JsonAlias也可以贴在Setter方法上。

你可能感兴趣的:(java,序列化,反序列化,serialize,字段)