solon-serialization-snack4 [试用]
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-serialization-snack4</artifactId>
</dependency>
1、描述
序列化扩展插件,为 Solon Serialization 提供基于 snack4(代码仓库)的框架适配。这插件也可用作 Solon Rpc 的服务端序列化方案。v3.6.1-M1 后支持
使用时,会涉及到格式化的定制,其它就不会有显示的感受。
2、主要接口实现类
类 | 实现接口 | 备注 |
---|---|---|
Snack4StringSerializer | Serializer, EntityStringSerializer | json 序列化器 |
Snack4EntityConverter | EntityConverter | json 实体转换器 |
何时会被时用?当 Content-Type 为 application/json(或 text/json)时会执行。
3、快捷格式化输出配置
solon.serialization.json:
dateAsFormat: 'yyyy-MM-dd HH:mm:ss' #配置日期格式(默认输出为时间戳,对 Date、LocalDateTime 有效)
dateAsTimeZone: 'GMT+8' #配置时区
dateAsTicks: false #将date转为毫秒数(和 dateAsFormat 二选一)
longAsString: true #将long型转为字符串输出 (默认为false)
boolAsInt: false #将bool型转为字符串输出 (默认为false)
nullStringAsEmpty: false
nullBoolAsFalse: false
nullNumberAsZero: false
nullArrayAsEmpty: false
nullAsWriteable: false #输出所有null值
enumAsName: false #枚举使用名字
4、高级格式化定制(基于接口)
@Configuration
public class DemoConfig {
@Bean
public void config(Snack4StringSerializer serializer) {
//::序列化(用于渲染输出)
//示例1:添加编码器(支持简单模式和复杂模式)
serializer.addEncoder(Date.class, s -> s.getTime());
serializer.addEncoder(LocalDate.class, s -> s.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
serializer.addEncoder(Double.class, s -> String.valueOf(s));
serializer.addEncoder(BigDecimal.class, s -> s.toPlainString());
//示例2:通过编码器,做复杂类型的原生定制(基于框架原生接口)
serializer.addEncoder(Date.class, (c,v, node) -> node.setValue(v.getTime()));
//示例3:调整特性(例,添加枚举序列化为名字的特性)
serializer.getSerializeConfig().addFeatures(Feature.Write_EnumUsingName); //增加特性
serializer.getSerializeConfig().addFeatures(Feature.Write_OnlyUseSetter); //增加特性 //只使用 getter 属性做序列化输出
serializer.getSerializeConfig().removeFeatures(Feature.Write_BrowserCompatible); //移除特性
serializer.getSerializeConfig().setFeatures(Feature.Write_BrowserCompatible); //重设特性
//::反序列化(用于接收参数)
//示例4:“反序列化”添加特性
serializer.getDeserializeConfig().addFeatures(Feature.Write_EnumUsingName);
}
}
5、个性化输出定制
public class User{
public long userId;
public String name;
//排除序列化
public transient password; //使用 transient 排除具有通用性
//格式化日期
@ONodeAttr(format = "yyyy-MM-dd") //尽量不使用个性化定制//这样不会依赖具体框架
public Date birthday;
}
public enum BookType {
NOVEL(2,"小说"),
CLASSICS(3,"名著");
@ONodeAttr
public final int code; //使用 code 做为序列化的字段
public final String des;
BookType(int code, String des){this.code=code; this.des=des;}
}