当前位置:   article > 正文

自定义的数据库缓存层支持字段结构化——项目_数据库字段结构

数据库字段结构

项目背景

    首先我们有一套自己写的orm框架,使用上类似hibernate或spring(原理不一样,对hibernate和spring的原理也不是很清楚,总之是项目自创的),支持配置生成数据库表和table实体类,数据载入到逻辑层直接可通过实体类增删改查,table提供set get save delete方法可自动异步修改数据库,肥肠方便。

    对于游戏业务,经常用到json格式,转成String存储到实体类字段中,每次读和写都要手动转化,这就比较烦了

项目需求

    把json字符串的字段改成自定义结构实现Bean、BeanMap(extend HashMap implements Bean)、BeanList(extend ArrayList implements Bean),修改自定义对象的字段bean.setA(XXX)就可以自动更新到数据库,无需重新table.setB(bean)

遇到的问题

    Bean的增删改查已经实现(实现方法与table实体类类似)没什么问题了

    读过程String->Json->Bean  写过程Bean->Json->String,中间多了转Json操作,因为json比较好的支持String转换,key结构比较好的支持字段的增减

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.kwai.clover.core.entity.EntityBase;
  3. import com.kwai.clover.core.gen.JowGenFile;
  4. import com.kwai.clover.core.gen.entity.Bean;
  5. public final class BeanHumanInstDifficuty extends Bean {
  6. /** 是否解锁 */
  7. private boolean unlock;
  8. /** 是否通关过 */
  9. private boolean pass;
  10. /** 通关数量 */
  11. private int count;
  12. public static final class K {
  13. public static final String unlock = "u";
  14. public static final String pass = "p";
  15. public static final String count = "c";
  16. }
  17. public void setUnlock(boolean unlock) {
  18. this.unlock = unlock;
  19. modifyField();
  20. }
  21. public boolean isUnlock() {
  22. return this.unlock;
  23. }
  24. public void setPass(boolean pass) {
  25. this.pass = pass;
  26. modifyField();
  27. }
  28. public boolean isPass() {
  29. return this.pass;
  30. }
  31. public void setCount(int count) {
  32. this.count = count;
  33. modifyField();
  34. }
  35. public int getCount() {
  36. return this.count;
  37. }
  38. @Override
  39. public boolean equals(Object obj) {
  40. if(obj instanceof BeanHumanInstDifficuty) {
  41. BeanHumanInstDifficuty p = (BeanHumanInstDifficuty)obj;
  42. return unlock == p.unlock;
  43. }
  44. return false;
  45. }
  46. @Override
  47. public void writeToJson(JSONObject jo) {
  48. jo.put(K.unlock, unlock ? 1 : 0);
  49. jo.put(K.pass, pass ? 1 : 0);
  50. jo.put(K.count, count);
  51. }
  52. @Override
  53. public void readFromJson(JSONObject jo) {
  54. unlock = jo.getIntValue(K.unlock) == 1;
  55. pass = jo.getIntValue(K.pass) == 1;
  56. count = jo.getIntValue(K.count);
  57. }
  58. private String toBeanString() {
  59. // TODO 不通过json转换成String
  60. return null;
  61. }
  62. public static void main(String[] args) {
  63. BeanHumanInstDifficuty bean = new BeanHumanInstDifficuty();
  64. bean.setCount(1);
  65. bean.setPass(true);
  66. bean.setUnlock(true);
  67. // 通过json转成String(下面三行在实际项目中会被封装,使用上无需手动new JSONObject())
  68. JSONObject jo = new JSONObject();
  69. bean.writeToJson(jo);
  70. String result = jo.toJSONString();
  71. // TODO 终极方法 未实现
  72. result = bean.toBeanString();
  73. }
  74. }

    目标是改成读过程String->Bean  写过程Bean->String,哪位大佬有什么比较好的方法吗

 

 

//--------------------------解决啦----------------------------------------

    一切的打版都在fastjson里,这几天看了fastjson的源码,主要一下几点:

    1.实测序列化和反序列类的速度比jsonObject要快,因为fastjson在第一次反射的时候把类信息保存到了

SerializeConfig.globalInstance中,所以不用担心反射问题,确实第一眼看上去感觉jsonObject会比类快

    2.升级了到了1.2.58,只是想升级,发现最新版1.2.62的序列化和反序列化速度要比老版本和1.2.58慢很多,不知道为啥,咱也没问

    3.fastjson提供了@JSONField和@JSONType辅助序列化反序列化,提供了一些过滤器和key重命名,肥肠方便。在实际项目中主要用JSONType的PropertyFilter过滤器过滤没赋值的字段,可以节省很大的空间;用JSONField的name重命名字段名,减少长度,但是耗时增长了一倍,可自行取舍。以下是注解的相关说明

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})//一般作用在字段上
  3. public @interface JSONField {
  4. int ordinal() default 0;//配置序列化和反序列化的顺序
  5. String name() default "";//配置序列化和反序列化时字段的名字
  6. String format() default "";//字段格式化,对日期很有用
  7. boolean serialize() default true;//是否序列化
  8. boolean deserialize() default true;//是否反序列化
  9. SerializerFeature[] serialzeFeatures() default {};//控制序列化的一些规则,如NULL的处理
  10. Feature[] parseFeatures() default {};//控制反序列化的一些规则
  11. String label() default "";
  12. boolean jsonDirect() default false;//当有一个字段是字符串类型,里面是json格式数据,希望直接输入,而不是经过转义之后再输出。
  13. Class<?> serializeUsing() default Void.class;//对某一个类的某个属性定制序列化
  14. Class<?> deserializeUsing() default Void.class;//对某一个类的某个属性定制反序列化
  15. String[] alternateNames() default {};//反序列化时使用多个不同的字段名称
  16. }
  1. package com.alibaba.fastjson.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. import com.alibaba.fastjson.PropertyNamingStrategy;
  7. import com.alibaba.fastjson.parser.Feature;
  8. import com.alibaba.fastjson.serializer.SerializeFilter;
  9. import com.alibaba.fastjson.serializer.SerializerFeature;
  10. @Retention(RetentionPolicy.RUNTIME)
  11. //需要标注在类上
  12. @Target({ ElementType.TYPE })
  13. public @interface JSONType {
  14. boolean asm() default true;
  15. //这里可以定义输出json的字段顺序
  16. String[] orders() default {};
  17. //包含的字段
  18. String[] includes() default {};
  19. //不包含的字段
  20. String[] ignores() default {};
  21. //类级别的序列化特性定义
  22. SerializerFeature[] serialzeFeatures() default {};
  23. Feature[] parseFeatures() default {};
  24. //按字母顺序进行输出
  25. boolean alphabetic() default true;
  26. Class<?> mappingTo() default Void.class;
  27. Class<?> builder() default Void.class;
  28. String typeName() default "";
  29. String typeKey() default "";
  30. Class<?>[] seeAlso() default{};
  31. //序列化类
  32. Class<?> serializer() default Void.class;
  33. //反序列化类
  34. Class<?> deserializer() default Void.class;
  35. boolean serializeEnumAsJavaBean() default false;
  36. PropertyNamingStrategy naming() default PropertyNamingStrategy.CamelCase;
  37. Class<? extends SerializeFilter>[] serialzeFilters() default {};
  38. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/839216
推荐阅读
相关标签
  

闽ICP备14008679号