GlobalSaveDataImpl.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { Bean } from "../../Bean/Bean"
  2. import { GlobalSaveData, SaveInterface } from "./DataAnnotation"
  3. type Constructor<T = unknown> = new (...args: any[]) => T
  4. @Bean(GlobalSaveData, 'FRAMEWORK')
  5. class GlobalSaveDataImpl extends GlobalSaveData {
  6. serialize<T>(serializeData: T, key?: Constructor<T>): Object {
  7. let res = {}
  8. if (!serializeData) {
  9. return null
  10. }
  11. // 获取该类的构造器
  12. let constructor = key || (serializeData as any)?.constructor
  13. if (getClassInheritanceLevel(constructor, SaveInterface)) {
  14. return (serializeData as SaveInterface).serialize()
  15. }
  16. // 如果不是定义的序列化类,则不需要序列化
  17. if (!this.isCompoent(constructor)) {
  18. return null
  19. }
  20. // 获取需要序列化的属性
  21. let values = this.getPropMap().get(constructor)
  22. values.forEach((v, k: string) => {
  23. let serializeName = v.serializeName
  24. // 获取该类的属性值
  25. let porpValue = serializeData[k]
  26. let data = this.getObj(v.constructor, porpValue)
  27. res[serializeName] = data
  28. })
  29. return res
  30. }
  31. unserialize<T>(key: Constructor<T>, saveData: any): T {
  32. if (!key) {
  33. return null
  34. }
  35. let component = new key
  36. if (getClassInheritanceLevel(key, SaveInterface)) {
  37. return (component as SaveInterface).unserialize(saveData) as T
  38. }
  39. saveData = saveData || {}
  40. // 获取需要反序列化的属性
  41. let values = this.getPropMap().get(key)
  42. if (!values) {
  43. return component
  44. }
  45. // 给属性赋值
  46. values.forEach((v, k: string) => {
  47. let data = this.getData(v.constructor, saveData[v.serializeName])
  48. if (data == null) {
  49. let defaultValue = null
  50. if (typeof v.defaultValue == 'function') {
  51. defaultValue = v.defaultValue()
  52. } else {
  53. defaultValue = v.defaultValue
  54. }
  55. component[k] = defaultValue
  56. return
  57. }
  58. component[k] = data
  59. })
  60. return component
  61. }
  62. /**
  63. * 将任意值转换为指定类型
  64. * @param type value 输入值
  65. * @param vlaue 转换后的值或null
  66. * @returns
  67. */
  68. getData(type: Constructor, vlaue: any) {
  69. let v = vlaue ?? null
  70. // 先判断特殊类的处理方式
  71. if (this.isCompoent(type) || getClassInheritanceLevel(type, SaveInterface)) {
  72. return this.unserialize(type, vlaue)
  73. }
  74. if (v == null) {
  75. return null
  76. }
  77. if (type instanceof Map) {
  78. let map = new Map
  79. Object.keys(v).forEach((k) => {
  80. map.set(k, v[k])
  81. })
  82. return map
  83. } else if (type instanceof Set) {
  84. return new Set(v)
  85. } else if (type instanceof Array) {
  86. return JSON.parse(vlaue)
  87. } else {
  88. // 如果都不是默认为基本数据类型
  89. return vlaue
  90. }
  91. }
  92. /**
  93. * 将任意类型序列化为{}
  94. * @param type value 输入值
  95. * @param vlaue 转换后的值或null
  96. * @returns
  97. */
  98. getObj<T>(type: Constructor<T>, vlaue: T) {
  99. let v = vlaue ?? null
  100. // 先判断特殊类的处理方式
  101. if (this.isCompoent(type) || getClassInheritanceLevel(type, SaveInterface)) {
  102. return this.serialize(vlaue, type)
  103. }
  104. if (v == null) {
  105. return null
  106. }
  107. if (type instanceof Map) {
  108. return JSON.stringify(vlaue)
  109. } else if (type instanceof Set) {
  110. return JSON.stringify(vlaue)
  111. } else if (type instanceof Array) {
  112. return JSON.stringify(vlaue)
  113. } else {
  114. // 如果都不是默认为基本数据类型
  115. return vlaue
  116. }
  117. }
  118. }
  119. /**
  120. * 判断类 subClass 是否是类 superClass 的第 n 级子类
  121. * @param subClass 子类构造函数
  122. * @param superClass 父类构造函数
  123. * @returns 继承层级(1表示直接子类),未继承返回 -1
  124. */
  125. function getClassInheritanceLevel(subClass: Function, superClass: Function): boolean {
  126. if (typeof subClass !== 'function' || typeof superClass !== 'function') return false;
  127. return subClass['spuerTop'] == superClass['spuerTop']
  128. // return -1;
  129. }