本文核心是带大家全面了解oinone的序列方式,包括支持的序列化类型、注意点、如果新增客户化序列化方式以及字段默认值的反序列化。
字段序列化方式说明
序列化方式 | 说明 | 备注 |
---|---|---|
JSON | JSON序列化 | 主要用于模型相关类型字段的序列化,是@Field.serialize默认选项 |
DOT | 点拼接集合元素 | |
COMMA | 逗号拼接集合元素 | |
BIT | 按位与,2次幂数求和 | 非@Field.serialize可选项列表,用于二进制枚举序列化不需要配置,由oinone自动推断 |
字段序列化方式举例
1、给模型PetItemDetail 增加两个字段:petItemDetails类型为List
2、同时设置 @Field.Advanced(columnDefinition = "varchar(1024)"),防止序列化后存储过长。
@Model.model(PetItem.MODEL_MODEL)
@Model(displayName = "宠物商品",summary="宠物商品",labelFields = {"itemName"})
public class PetItem extends AbstractDemoCodeModel{
public static final String MODEL_MODEL="demo.PetItem";
@Field(displayName = "品种")
@Field.many2one
@Field.Relation(relationFields = {"typeId"},referenceFields = {"id"})
private PetType type;
@Field(displayName = "品种类型",invisible = true)
private Long typeId;
@Field(displayName = "详情", serialize = Field.serialize.JSON, store = NullableBoolEnum.TRUE)
@Field.Advanced(columnDefinition = "varchar(1024)")
private List<PetItemDetail> petItemDetails;
@Field(displayName = "商品标签",serialize = Field.serialize.COMMA,store = NullableBoolEnum.TRUE,multi = true)
@Field.Advanced(columnDefinition = "varchar(1024)")
private List<String> tags;
}
字段序列化注意点
- 必须使用Field#store属性将字段存储设置为NullableBoolEnum.TRUE。
- 使用Field#serialize属性指定序列化方式,默认为JSON。
- 如把PetItemDetail设置为存储模型,须在PetItem的petItemDetails字段上使用Field.Relation#store属性将关联关系存储设置为false。不然会同时存储petItemDetails字段和对应的PetItemDetail表记录
注册自己的序列化器
注册自己的序列化器(实现pro.shushi.pamirs.meta.api.core.orm.serialize.Serializer接口), 如oinone的DOT的序列化方式,用type()方法返回值做匹配,serialize和deserialize分别对应序列化和反序列化方法。
package pro.shushi.pamirs.framework.compute.serialize;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;
import pro.shushi.pamirs.meta.api.core.orm.serialize.Serializer;
import pro.shushi.pamirs.meta.common.constants.CharacterConstants;
import pro.shushi.pamirs.meta.enmu.SerializeEnum;
import pro.shushi.pamirs.meta.util.TypeUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 点表达式序列生成处理器实现
* @author shushi@shushi.pro
* @version 1.0.0
*/
@SuppressWarnings("rawtypes")
@Slf4j
@Component
public class DotSerializeProcessor implements Serializer<Object, String> {
@Override
public String serialize(String ltype, Object value) {
if (null == value) {
return null;
}
if (List.class.isAssignableFrom(value.getClass())) {
return StringUtils.join((List) value, CharacterConstants.SEPARATOR_DOT);
} else {
return StringUtils.join(Collections.singletonList(value), CharacterConstants.SEPARATOR_DOT);
}
}
@SuppressWarnings("unchecked")
@Override
public Object deserialize(String ltype, String ltypeT, String value, String format) {
if (null == value) {
return null;
}
String[] dots = value.split(CharacterConstants.SEPARATOR_ESCAPE_DOT);
List list = new ArrayList();
for (String dot : dots) {
Object object = TypeUtils.valueOfPrimary(ltypeT, dot, null);
list.add(object);
}
return list;
}
@Override
public String type() {
return SerializeEnum.DOT.value();
}
}
字段默认值的反序列化
用@Field.defaultValue注解在字段上配置defaultValue属性时,将根据字段的Ttype类型及字段的Ltype等类型属性,自动进行反序列化。包括但不限于以下几种情况:
- OBJ、STRING、TEXT、HTML——保持不变
- BINARY、INTEGER——转换为整数
- FLOAT、MONEY——转换为浮点数
- DATETIME、DATE、TIME、YEAR——根据Field.Date#format属性决定反序列化日期格式
- BOOLEAN——仅允许null、true、false
- ENUM——使用value进行匹配
Oinone社区 作者:望闲原创文章,如若转载,请注明出处:https://doc.oinone.top/backend/11389.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验