【苍穹开发】页面缓存IPageCache存储不同的数据结构原创
18人赞赏了该文章
2,565次浏览
编辑于2021年12月05日 15:23:38
苍穹开发功能,页面缓存IPageCache
表单插件开发中必备利器,允许用于存放变量或其他关键数据,提高查询效率,减少数据库访问。
苍穹官方提供的IPageCache接口都是存放字符串类型数据
put(String var1, String var2)
put(Map<String, String> var1)
putBigObject(String var1, String var2)
那么,问题来了,如果存放复杂的数据结构,有什么解决方案呢?
答案可想而知
那就是利用对象序列化,可以转为Json字符串或base64字符串,再使用页面缓存。
序列化类建议使用苍穹封装帮助类,当然可以使用第三方包,比如fastJson,Jackson等。
kd.bos.dataentity.serialization.SerializationUtils
数据类型1:字符串
this.getPageCache().put("testkey", "testvalue");
String value=this.getPageCache().get("testkey");
数据类型2:对象
UserInfo user=new UserInfo();
user.setName("test");
user.setAge(18);
//序列化1:序列化为json字符串,并设置页面缓存user1
String userStr=SerializationUtils.toJsonString(user);
//序列化2:序列化为base64字符串 后面同样可以使用,前提是对象实现Serializable接口
String userStr= SerializationUtils.serializeToBase64(list);
this.getPageCache().put("user1", userStr);
//获取缓存user1
String userStr=this.getPageCache().put("user1");
//序列化1:json
UserInfo user=(UserInfo)SerializationUtils.fromJsonString(userStr,UserInfo.class);
//序列化2:base64字符串
UserInfo user=SerializationUtils.deSerializeFromBase64(userStr);
......后续代码逻辑
数据类型3:对象列表或字典
//设置缓存userlist1,
List<UserInfo> list=new ArrayList<UserInfo>();
.....添加数据至list
String userListStr=SerializationUtils.toJsonString(list);
this.getPageCache().put("userlist1", userListStr);
//获取缓存userlist1
String userListStr1= this.getPageCache().get("userlist1");
List<UserInfo> users= (List<UserInfo>) SerializationUtils.fromJsonStringToList(userListStr1, UserInfo.class);
......后续代码逻辑
数据类型4:苍穹业务对象
动态对象序列化帮助类
kd.bos.servicehelper.util.DynamicObjectSerializeUtil
//根据业务对象标识获取数据结构
DynamicObjectType dtType = EntityMetadataCache.getDataEntityType(EntityKey);
//序列化为字符串,设置缓存
String cacheDataStr= DynamicObjectSerializeUtil.serialize(new Object[]{obj}, dtType);
view.getPageCache().put(CACHE_ID, cacheDataStr);
//获取缓存,反序列化为苍穹动态对象
String objectStr= view.getPageCache().get(CACHE_ID);
Object[] cacheObject = DynamicObjectSerializeUtil.deserialize(objectStr, dtType);
以上是使用页面缓存功能缓存复杂对象的解决方案。如有建议或不足,请联系指正。