com.xmobitea.changx.gn-unity 2.0.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/Editor/GNServerSettingsEditor.cs +16 -300
  2. package/Runtime/Common/GNArray.cs +387 -302
  3. package/Runtime/Common/GNArray.cs.meta +11 -11
  4. package/Runtime/Common/GNData.cs +61 -48
  5. package/Runtime/Common/GNData.cs.meta +11 -11
  6. package/Runtime/Common/GNHashtable.cs +404 -241
  7. package/Runtime/Common/GNHashtable.cs.meta +11 -11
  8. package/Runtime/Common/IGNData.cs +20 -11
  9. package/Runtime/Common/IGNData.cs.meta +11 -11
  10. package/Runtime/Common.meta +8 -8
  11. package/Runtime/Config/GNServerSettings.cs +136 -92
  12. package/Runtime/Config/GNServerSettings.cs.meta +11 -11
  13. package/Runtime/Config.meta +8 -8
  14. package/Runtime/Constant/Commands.cs +82 -19
  15. package/Runtime/Constant/Commands.cs.meta +11 -11
  16. package/Runtime/Constant/EnumType/FriendStatus.cs +12 -12
  17. package/Runtime/Constant/EnumType/FriendStatus.cs.meta +11 -11
  18. package/Runtime/Constant/EnumType/GoogleLoginType.cs +5 -5
  19. package/Runtime/Constant/EnumType/GoogleLoginType.cs.meta +11 -11
  20. package/Runtime/Constant/EnumType/GroupStatus.cs +7 -7
  21. package/Runtime/Constant/EnumType/GroupStatus.cs.meta +11 -11
  22. package/Runtime/Constant/EnumType/InvalidMemberType.cs +23 -23
  23. package/Runtime/Constant/EnumType/InvalidMemberType.cs.meta +11 -11
  24. package/Runtime/Constant/EnumType/ItemType.cs +5 -5
  25. package/Runtime/Constant/EnumType/ItemType.cs.meta +11 -11
  26. package/Runtime/Constant/EnumType/MatchmakingMemberStatus.cs +6 -6
  27. package/Runtime/Constant/EnumType/MatchmakingMemberStatus.cs.meta +11 -11
  28. package/Runtime/Constant/EnumType/MatchmakingTicketStatus.cs +2 -2
  29. package/Runtime/Constant/EnumType/MatchmakingTicketStatus.cs.meta +11 -11
  30. package/Runtime/Constant/EnumType/OwnerType.cs +3 -2
  31. package/Runtime/Constant/EnumType/OwnerType.cs.meta +11 -11
  32. package/Runtime/Constant/EnumType/PermissionDataItem.cs +10 -10
  33. package/Runtime/Constant/EnumType/PermissionDataItem.cs.meta +11 -11
  34. package/Runtime/Constant/EnumType/PushPlatformType.cs +10 -0
  35. package/Runtime/Constant/EnumType/PushPlatformType.cs.meta +11 -0
  36. package/Runtime/Constant/EnumType/RequestRole.cs +11 -11
  37. package/Runtime/Constant/EnumType/RequestRole.cs.meta +7 -7
  38. package/Runtime/Constant/EnumType/RequestType.cs +20 -19
  39. package/Runtime/Constant/EnumType/RequestType.cs.meta +11 -11
  40. package/Runtime/Constant/EnumType/StoreReceiveType.cs +13 -0
  41. package/Runtime/Constant/EnumType/StoreReceiveType.cs.meta +11 -0
  42. package/Runtime/Constant/EnumType.meta +8 -8
  43. package/Runtime/Constant/ErrorCode/GNErrorCode.cs +53 -48
  44. package/Runtime/Constant/ErrorCode/GNErrorCode.cs.meta +7 -7
  45. package/Runtime/Constant/ErrorCode.meta +8 -8
  46. package/Runtime/Constant/EventCode.cs +43 -16
  47. package/Runtime/Constant/EventCode.cs.meta +11 -11
  48. package/Runtime/Constant/OperationCode.cs +249 -211
  49. package/Runtime/Constant/OperationCode.cs.meta +11 -11
  50. package/Runtime/Constant/ParameterCode/GNParameterCode.cs +610 -466
  51. package/Runtime/Constant/ParameterCode/GNParameterCode.cs.meta +11 -11
  52. package/Runtime/Constant/ParameterCode/ParameterCode.cs +12 -12
  53. package/Runtime/Constant/ParameterCode/ParameterCode.cs.meta +11 -11
  54. package/Runtime/Constant/ParameterCode.meta +8 -8
  55. package/Runtime/Constant/ReturnCode.cs +73 -25
  56. package/Runtime/Constant/ReturnCode.cs.meta +11 -11
  57. package/Runtime/Constant.meta +8 -8
  58. package/Runtime/Entity/DataMember.cs +342 -124
  59. package/Runtime/Entity/DataMember.cs.meta +11 -11
  60. package/Runtime/Entity/GNMetadata.cs +72 -27
  61. package/Runtime/Entity/GNMetadata.cs.meta +11 -11
  62. package/Runtime/Entity/InvalidMember.cs +52 -33
  63. package/Runtime/Entity/InvalidMember.cs.meta +11 -11
  64. package/Runtime/Entity/Models/AuthenticateModels.cs +251 -207
  65. package/Runtime/Entity/Models/AuthenticateModels.cs.meta +11 -11
  66. package/Runtime/Entity/Models/AuthenticateRequestModels.cs +153 -131
  67. package/Runtime/Entity/Models/AuthenticateRequestModels.cs.meta +11 -11
  68. package/Runtime/Entity/Models/AuthenticateResponseModels.cs +61 -51
  69. package/Runtime/Entity/Models/AuthenticateResponseModels.cs.meta +11 -11
  70. package/Runtime/Entity/Models/CharacterPlayerModels.cs +985 -849
  71. package/Runtime/Entity/Models/CharacterPlayerModels.cs.meta +11 -11
  72. package/Runtime/Entity/Models/CharacterPlayerRequestModels.cs +957 -885
  73. package/Runtime/Entity/Models/CharacterPlayerRequestModels.cs.meta +11 -11
  74. package/Runtime/Entity/Models/CharacterPlayerResponseModels.cs +165 -150
  75. package/Runtime/Entity/Models/CharacterPlayerResponseModels.cs.meta +11 -11
  76. package/Runtime/Entity/Models/CloudScriptModels.cs +185 -0
  77. package/Runtime/Entity/Models/CloudScriptModels.cs.meta +11 -0
  78. package/Runtime/Entity/Models/CloudScriptRequestModels.cs +134 -0
  79. package/Runtime/Entity/Models/CloudScriptRequestModels.cs.meta +11 -0
  80. package/Runtime/Entity/Models/CloudScriptResponseModels.cs +34 -0
  81. package/Runtime/Entity/Models/CloudScriptResponseModels.cs.meta +11 -0
  82. package/Runtime/Entity/Models/ContentModels.cs +150 -153
  83. package/Runtime/Entity/Models/ContentModels.cs.meta +11 -11
  84. package/Runtime/Entity/Models/ContentRequestModels.cs +129 -129
  85. package/Runtime/Entity/Models/ContentRequestModels.cs.meta +11 -11
  86. package/Runtime/Entity/Models/ContentResponseModels.cs +24 -24
  87. package/Runtime/Entity/Models/ContentResponseModels.cs.meta +11 -11
  88. package/Runtime/Entity/Models/DashboardModels.cs +1684 -1156
  89. package/Runtime/Entity/Models/DashboardModels.cs.meta +11 -11
  90. package/Runtime/Entity/Models/DashboardRequestModels.cs +220 -147
  91. package/Runtime/Entity/Models/DashboardRequestModels.cs.meta +11 -11
  92. package/Runtime/Entity/Models/DashboardResponseModels.cs +92 -57
  93. package/Runtime/Entity/Models/DashboardResponseModels.cs.meta +11 -11
  94. package/Runtime/Entity/Models/GamePlayerModels.cs +1073 -933
  95. package/Runtime/Entity/Models/GamePlayerModels.cs.meta +11 -11
  96. package/Runtime/Entity/Models/GamePlayerRequestModels.cs +939 -867
  97. package/Runtime/Entity/Models/GamePlayerRequestModels.cs.meta +11 -11
  98. package/Runtime/Entity/Models/GamePlayerResponseModels.cs +162 -147
  99. package/Runtime/Entity/Models/GamePlayerResponseModels.cs.meta +11 -11
  100. package/Runtime/Entity/Models/GenericModels.cs +102 -102
  101. package/Runtime/Entity/Models/GenericModels.cs.meta +11 -11
  102. package/Runtime/Entity/Models/GroupModels.cs +812 -676
  103. package/Runtime/Entity/Models/GroupModels.cs.meta +11 -11
  104. package/Runtime/Entity/Models/GroupRequestModels.cs +741 -669
  105. package/Runtime/Entity/Models/GroupRequestModels.cs.meta +11 -11
  106. package/Runtime/Entity/Models/GroupResponseModels.cs +129 -114
  107. package/Runtime/Entity/Models/GroupResponseModels.cs.meta +11 -11
  108. package/Runtime/Entity/Models/InventoryModels.cs +667 -558
  109. package/Runtime/Entity/Models/InventoryModels.cs.meta +11 -11
  110. package/Runtime/Entity/Models/InventoryRequestModels.cs +626 -579
  111. package/Runtime/Entity/Models/InventoryRequestModels.cs.meta +11 -11
  112. package/Runtime/Entity/Models/InventoryResponseModels.cs +109 -99
  113. package/Runtime/Entity/Models/InventoryResponseModels.cs.meta +11 -11
  114. package/Runtime/Entity/Models/MasterPlayerModels.cs +1882 -1340
  115. package/Runtime/Entity/Models/MasterPlayerModels.cs.meta +11 -11
  116. package/Runtime/Entity/Models/MasterPlayerRequestModels.cs +1643 -1253
  117. package/Runtime/Entity/Models/MasterPlayerRequestModels.cs.meta +11 -11
  118. package/Runtime/Entity/Models/MasterPlayerResponseModels.cs +293 -213
  119. package/Runtime/Entity/Models/MasterPlayerResponseModels.cs.meta +11 -11
  120. package/Runtime/Entity/Models/MultiplayerModels.cs +293 -223
  121. package/Runtime/Entity/Models/MultiplayerModels.cs.meta +11 -11
  122. package/Runtime/Entity/Models/MultiplayerRequestModels.cs +199 -149
  123. package/Runtime/Entity/Models/MultiplayerRequestModels.cs.meta +11 -11
  124. package/Runtime/Entity/Models/MultiplayerResponseModels.cs +59 -49
  125. package/Runtime/Entity/Models/MultiplayerResponseModels.cs.meta +11 -11
  126. package/Runtime/Entity/Models/StoreInventoryModels.cs +514 -323
  127. package/Runtime/Entity/Models/StoreInventoryModels.cs.meta +11 -11
  128. package/Runtime/Entity/Models/StoreInventoryRequestModels.cs +236 -165
  129. package/Runtime/Entity/Models/StoreInventoryRequestModels.cs.meta +11 -11
  130. package/Runtime/Entity/Models/StoreInventoryResponseModels.cs +45 -30
  131. package/Runtime/Entity/Models/StoreInventoryResponseModels.cs.meta +11 -11
  132. package/Runtime/Entity/Models.meta +8 -8
  133. package/Runtime/Entity/OperationEvent.cs +111 -75
  134. package/Runtime/Entity/OperationEvent.cs.meta +11 -11
  135. package/Runtime/Entity/OperationHelper.cs +51 -35
  136. package/Runtime/Entity/OperationHelper.cs.meta +11 -11
  137. package/Runtime/Entity/OperationRequest.cs +142 -99
  138. package/Runtime/Entity/OperationRequest.cs.meta +11 -11
  139. package/Runtime/Entity/OperationResponse.cs +111 -63
  140. package/Runtime/Entity/OperationResponse.cs.meta +11 -11
  141. package/Runtime/Entity/Request/CustomOperationRequest.cs +112 -61
  142. package/Runtime/Entity/Request/CustomOperationRequest.cs.meta +11 -11
  143. package/Runtime/Entity/Request.meta +8 -8
  144. package/Runtime/Entity/Response/CustomOperationResponse.cs +84 -63
  145. package/Runtime/Entity/Response/CustomOperationResponse.cs.meta +11 -11
  146. package/Runtime/Entity/Response.meta +8 -8
  147. package/Runtime/Entity.meta +8 -8
  148. package/Runtime/GNNetwork.cs +496 -182
  149. package/Runtime/GNNetwork.cs.meta +11 -11
  150. package/Runtime/GNNetworkApi.cs +38 -19
  151. package/Runtime/GNNetworkApi.cs.meta +11 -11
  152. package/Runtime/GNNetworkAuthenticateApi.cs +531 -98
  153. package/Runtime/GNNetworkAuthenticateApi.cs.meta +11 -11
  154. package/Runtime/GNNetworkCharacterPlayerApi.cs +1587 -762
  155. package/Runtime/GNNetworkCharacterPlayerApi.cs.meta +11 -11
  156. package/Runtime/GNNetworkCloudScriptApi.cs +181 -0
  157. package/Runtime/GNNetworkCloudScriptApi.cs.meta +11 -0
  158. package/Runtime/GNNetworkContentApi.cs +238 -132
  159. package/Runtime/GNNetworkContentApi.cs.meta +11 -11
  160. package/Runtime/GNNetworkDashboardApi.cs +278 -117
  161. package/Runtime/GNNetworkDashboardApi.cs.meta +11 -11
  162. package/Runtime/GNNetworkGamePlayerApi.cs +1558 -747
  163. package/Runtime/GNNetworkGamePlayerApi.cs.meta +11 -11
  164. package/Runtime/GNNetworkGroupApi.cs +1228 -582
  165. package/Runtime/GNNetworkGroupApi.cs.meta +11 -11
  166. package/Runtime/GNNetworkInventoryApi.cs +1048 -507
  167. package/Runtime/GNNetworkInventoryApi.cs.meta +11 -11
  168. package/Runtime/GNNetworkMasterPlayerApi.cs +2586 -1067
  169. package/Runtime/GNNetworkMasterPlayerApi.cs.meta +11 -11
  170. package/Runtime/GNNetworkMultiplayerApi.cs +328 -147
  171. package/Runtime/GNNetworkMultiplayerApi.cs.meta +11 -11
  172. package/Runtime/GNNetworkStoreInventoryApi.cs +388 -162
  173. package/Runtime/GNNetworkStoreInventoryApi.cs.meta +11 -11
  174. package/Runtime/Helper/CodeHelper.cs +140 -98
  175. package/Runtime/Helper/CodeHelper.cs.meta +11 -11
  176. package/Runtime/Helper/ConverterService.cs +236 -52
  177. package/Runtime/Helper/ConverterService.cs.meta +11 -11
  178. package/Runtime/Helper/ParseGNHelper.cs +451 -451
  179. package/Runtime/Helper/ParseGNHelper.cs.meta +11 -11
  180. package/Runtime/Helper.meta +8 -8
  181. package/Runtime/Logger/GNDebug.cs +92 -49
  182. package/Runtime/Logger/GNDebug.cs.meta +11 -11
  183. package/Runtime/Logger.meta +8 -8
  184. package/Runtime/Networking/AuthenticateStatus.cs +57 -35
  185. package/Runtime/Networking/AuthenticateStatus.cs.meta +11 -11
  186. package/Runtime/Networking/Handler/IServerEventHandler.cs +25 -25
  187. package/Runtime/Networking/Handler/IServerEventHandler.cs.meta +11 -11
  188. package/Runtime/Networking/Handler/OnCharacterPlayerFriendUpdateEventHandler.cs +61 -32
  189. package/Runtime/Networking/Handler/OnCharacterPlayerFriendUpdateEventHandler.cs.meta +11 -11
  190. package/Runtime/Networking/Handler/OnCharacterPlayerGroupUpdateEventHandler.cs +54 -33
  191. package/Runtime/Networking/Handler/OnCharacterPlayerGroupUpdateEventHandler.cs.meta +11 -11
  192. package/Runtime/Networking/Handler/OnGamePlayerFriendUpdateEventHandler.cs +54 -32
  193. package/Runtime/Networking/Handler/OnGamePlayerFriendUpdateEventHandler.cs.meta +11 -11
  194. package/Runtime/Networking/Handler/OnGamePlayerGroupUpdateEventHandler.cs +54 -32
  195. package/Runtime/Networking/Handler/OnGamePlayerGroupUpdateEventHandler.cs.meta +11 -11
  196. package/Runtime/Networking/Handler/OnGroupMemberUpdateEventHandler.cs +48 -29
  197. package/Runtime/Networking/Handler/OnGroupMemberUpdateEventHandler.cs.meta +11 -11
  198. package/Runtime/Networking/Handler/OnGroupMessageUpdateEventHandler.cs +47 -29
  199. package/Runtime/Networking/Handler/OnGroupMessageUpdateEventHandler.cs.meta +11 -11
  200. package/Runtime/Networking/Handler.meta +8 -8
  201. package/Runtime/Networking/Http/HttpPeer.cs +68 -25
  202. package/Runtime/Networking/Http/HttpPeer.cs.meta +11 -11
  203. package/Runtime/Networking/Http/NetworkingHttpPeerBase.cs +65 -25
  204. package/Runtime/Networking/Http/NetworkingHttpPeerBase.cs.meta +11 -11
  205. package/Runtime/Networking/Http/NetworkingPeerHttpClientRequest.cs +513 -486
  206. package/Runtime/Networking/Http/NetworkingPeerHttpClientRequest.cs.meta +11 -11
  207. package/Runtime/Networking/Http/NetworkingPeerHttpRequest.cs +172 -142
  208. package/Runtime/Networking/Http/NetworkingPeerHttpRequest.cs.meta +11 -11
  209. package/Runtime/Networking/Http/NetworkingPeerUnityWebRequest.cs +225 -188
  210. package/Runtime/Networking/Http/NetworkingPeerUnityWebRequest.cs.meta +11 -11
  211. package/Runtime/Networking/Http.meta +8 -8
  212. package/Runtime/Networking/IPeer.cs +41 -19
  213. package/Runtime/Networking/IPeer.cs.meta +11 -11
  214. package/Runtime/Networking/NetworkingPeer.cs +198 -144
  215. package/Runtime/Networking/NetworkingPeer.cs.meta +11 -11
  216. package/Runtime/Networking/NetworkingPeerAPI.cs +20 -21
  217. package/Runtime/Networking/NetworkingPeerAPI.cs.meta +11 -11
  218. package/Runtime/Networking/OperationPending.cs +159 -95
  219. package/Runtime/Networking/OperationPending.cs.meta +11 -11
  220. package/Runtime/Networking/PeerBase.cs +305 -242
  221. package/Runtime/Networking/PeerBase.cs.meta +11 -11
  222. package/Runtime/Networking/Socket/NetworkingPeerSocketV2.cs +222 -185
  223. package/Runtime/Networking/Socket/NetworkingPeerSocketV2.cs.meta +11 -11
  224. package/Runtime/Networking/Socket/NetworkingPeerSocketV3.cs +235 -177
  225. package/Runtime/Networking/Socket/NetworkingPeerSocketV3.cs.meta +11 -11
  226. package/Runtime/Networking/Socket/NetworkingSocketPeerBase.cs +165 -23
  227. package/Runtime/Networking/Socket/NetworkingSocketPeerBase.cs.meta +11 -11
  228. package/Runtime/Networking/Socket/SocketPeer.cs +242 -197
  229. package/Runtime/Networking/Socket/SocketPeer.cs.meta +11 -11
  230. package/Runtime/Networking/Socket.meta +8 -8
  231. package/Runtime/Networking.meta +8 -8
  232. package/Runtime/Unity/ServiceCoroutine.cs +10 -0
  233. package/Runtime/Unity/ServiceCoroutine.cs.meta +11 -0
  234. package/Runtime/Unity/ServiceUpdate.cs +33 -20
  235. package/Runtime/Unity/ServiceUpdate.cs.meta +11 -11
  236. package/Runtime/Unity.meta +8 -8
  237. package/Runtime/XmobiTea.GN.runtime.asmdef +16 -16
  238. package/Runtime/XmobiTea.GN.runtime.asmdef.meta +7 -7
  239. package/package.json +1 -1
@@ -7,40 +7,52 @@
7
7
  using XmobiTea.GN.Common;
8
8
  using XmobiTea.GN.Entity;
9
9
 
10
+ /// <summary>
11
+ /// Mapper class for extracting and caching metadata of fields in a class decorated with DataMember attributes.
12
+ /// </summary>
10
13
  internal class DataMemberFieldInfoTypeMapper
11
14
  {
15
+ // A cache to store metadata mappings of fields for each class type
12
16
  private Dictionary<Type, GNEnhancedObjectFieldMetadata[]> declaredFieldsMap;
13
17
 
18
+ // Retrieves metadata for all fields in a class, including inherited ones
14
19
  public GNEnhancedObjectFieldMetadata[] getGNEnhancedObjectFieldMetadata(System.Type cls)
15
20
  {
16
21
  GNEnhancedObjectFieldMetadata[] declaredFields;
17
22
 
18
- if (this.declaredFieldsMap.ContainsKey(cls)) declaredFields = this.declaredFieldsMap[cls];
23
+ // If the class has been mapped, return the cached metadata
24
+ if (this.declaredFieldsMap.ContainsKey(cls))
25
+ {
26
+ declaredFields = this.declaredFieldsMap[cls];
27
+ }
19
28
  else
20
29
  {
30
+ // List to store all found fields
21
31
  var fieldInfoLst = new List<FieldInfo>();
22
32
 
23
33
  var currentCls = cls;
24
34
 
35
+ // Iterate through the class hierarchy to find all fields
25
36
  while (true)
26
37
  {
27
- var allDeclaredFields = currentCls.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly).Where(field => field.GetCustomAttribute<DataMemberAttribute>(true) != null);
38
+ // Retrieve all fields marked with the DataMemberAttribute
39
+ var allDeclaredFields = currentCls.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)
40
+ .Where(field => field.GetCustomAttribute<DataMemberAttribute>(true) != null);
28
41
 
29
42
  foreach (var field in allDeclaredFields)
30
43
  {
44
+ // Check if the field already exists in the list, add it if not
31
45
  var thisDeclaredField = fieldInfoLst.Find(x => x.Name.Equals(field.Name));
32
-
33
46
  if (thisDeclaredField == null) fieldInfoLst.Add(field);
34
47
  }
35
48
 
36
- if (currentCls.BaseType == typeof(object))
37
- {
38
- break;
39
- }
49
+ // If we have reached the base class (object), exit the loop
50
+ if (currentCls.BaseType == typeof(object)) break;
40
51
 
41
52
  currentCls = currentCls.BaseType;
42
53
  }
43
54
 
55
+ // Create an array to hold the metadata for the fields
44
56
  declaredFields = new GNEnhancedObjectFieldMetadata[fieldInfoLst.Count];
45
57
 
46
58
  for (var i = 0; i < fieldInfoLst.Count; i++)
@@ -49,12 +61,13 @@
49
61
 
50
62
  var field = fieldInfoLst[i];
51
63
 
64
+ // Retrieve the attribute information for the field
52
65
  var dataMemberAnno = field.GetCustomAttribute<DataMemberAttribute>(true);
53
66
 
67
+ // Handle each specific type of attribute and map its data to GNEnhancedObjectFieldMetadata
54
68
  if (dataMemberAnno is StringDataMemberAttribute stringDataMemberAnno)
55
69
  {
56
70
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.String, field.FieldType, field);
57
-
58
71
  gnEnhancedObjectFieldMetadata.defaultValue = stringDataMemberAnno.defaultValue;
59
72
  gnEnhancedObjectFieldMetadata.mustNonNull = stringDataMemberAnno.mustNonNull;
60
73
  gnEnhancedObjectFieldMetadata.minLength = stringDataMemberAnno.minLength;
@@ -63,13 +76,11 @@
63
76
  else if (dataMemberAnno is BooleanDataMemberAttribute booleanDataMemberAnno)
64
77
  {
65
78
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.Boolean, field.FieldType, field);
66
-
67
79
  gnEnhancedObjectFieldMetadata.defaultValue = booleanDataMemberAnno.defaultValue;
68
80
  }
69
81
  else if (dataMemberAnno is GNHashtableDataMemberAttribute gnHashtableDataMemberAnno)
70
82
  {
71
83
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.Object, field.FieldType, field);
72
-
73
84
  gnEnhancedObjectFieldMetadata.defaultValue = gnHashtableDataMemberAnno.defaultValue;
74
85
  gnEnhancedObjectFieldMetadata.mustNonNull = gnHashtableDataMemberAnno.mustNonNull;
75
86
  gnEnhancedObjectFieldMetadata.minLength = gnHashtableDataMemberAnno.minLength;
@@ -78,7 +89,6 @@
78
89
  else if (dataMemberAnno is GNArrayDataMemberAttribute gnArrayDataMemberAnno)
79
90
  {
80
91
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.Array, gnArrayDataMemberAnno.elementCls == null ? field.FieldType : gnArrayDataMemberAnno.elementCls, field);
81
-
82
92
  gnEnhancedObjectFieldMetadata.defaultValue = gnArrayDataMemberAnno.defaultValue;
83
93
  gnEnhancedObjectFieldMetadata.mustNonNull = gnArrayDataMemberAnno.mustNonNull;
84
94
  gnEnhancedObjectFieldMetadata.minLength = gnArrayDataMemberAnno.minLength;
@@ -87,7 +97,6 @@
87
97
  else if (dataMemberAnno is NumberDataMemberAttribute numberDataMemberAnno)
88
98
  {
89
99
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.Number, field.FieldType, field);
90
-
91
100
  gnEnhancedObjectFieldMetadata.defaultValue = numberDataMemberAnno.defaultValue;
92
101
  gnEnhancedObjectFieldMetadata.minValue = numberDataMemberAnno.minValue;
93
102
  gnEnhancedObjectFieldMetadata.maxValue = numberDataMemberAnno.maxValue;
@@ -96,33 +105,41 @@
96
105
  else
97
106
  {
98
107
  gnEnhancedObjectFieldMetadata = new GNEnhancedObjectFieldMetadata(field.Name, FieldDataType.Object, field.FieldType, field);
99
-
100
108
  gnEnhancedObjectFieldMetadata.defaultValue = dataMemberAnno.defaultValue;
101
109
  }
102
110
 
111
+ // Map common properties from the attribute to the metadata
103
112
  gnEnhancedObjectFieldMetadata.code = dataMemberAnno.code;
104
113
  gnEnhancedObjectFieldMetadata.isOptional = dataMemberAnno.isOptional;
105
114
  gnEnhancedObjectFieldMetadata.gnFieldType = dataMemberAnno.gnFieldType;
106
115
 
116
+ // Add the field metadata to the array
107
117
  declaredFields[i] = gnEnhancedObjectFieldMetadata;
108
118
  }
109
119
 
120
+ // Cache the metadata for future access
110
121
  this.declaredFieldsMap[cls] = declaredFields;
111
122
  }
112
123
 
113
124
  return declaredFields;
114
125
  }
115
126
 
127
+ // Constructor initializes the declaredFieldsMap dictionary
116
128
  public DataMemberFieldInfoTypeMapper()
117
129
  {
118
130
  this.declaredFieldsMap = new Dictionary<Type, GNEnhancedObjectFieldMetadata[]>();
119
131
  }
120
132
  }
121
133
 
134
+ /// <summary>
135
+ /// Class responsible for deserializing objects and arrays from GNHashtable and GNArray
136
+ /// </summary>
122
137
  internal class DeserializeConverter
123
138
  {
139
+ // Mapper to retrieve metadata for fields with DataMember attributes
124
140
  private DataMemberFieldInfoTypeMapper dataMemberFieldInfoMapper;
125
141
 
142
+ // Cached type definitions for common types
126
143
  private Type typeOfByte;
127
144
  private Type typeOfSByte;
128
145
  private Type typeOfShort;
@@ -135,18 +152,36 @@
135
152
  private Type typeOfGNArray;
136
153
  private Type typeOfGNHashtable;
137
154
 
155
+ bool TryGetNullable(FieldInfo fieldInfo, out Type tType)
156
+ {
157
+ tType = Nullable.GetUnderlyingType(fieldInfo.FieldType);
158
+ return tType != null;
159
+ }
160
+
161
+ /// <summary>
162
+ /// Deserializes a GNHashtable into an object of the specified type.
163
+ /// </summary>
164
+ /// <param name="gnHashtable">The GNHashtable to deserialize.</param>
165
+ /// <param name="cls">The type of the object to create.</param>
166
+ /// <returns>An instance of the specified type populated with data from the GNHashtable.</returns>
138
167
  public object deserializeObject(GNHashtable gnHashtable, Type cls)
139
168
  {
169
+ // Return null if the input is null
140
170
  if (gnHashtable == null) return null;
141
171
 
172
+ // Retrieve metadata for all fields in the target type
142
173
  var declaredFields = this.dataMemberFieldInfoMapper.getGNEnhancedObjectFieldMetadata(cls);
143
174
 
175
+ // Create an instance of the target class
144
176
  var answer = Activator.CreateInstance(cls);
145
177
 
178
+ // Iterate through each field and populate its value from the GNHashtable
146
179
  foreach (var declaredField in declaredFields)
147
180
  {
181
+ // Retrieve the value for the field based on its code
148
182
  var value = gnHashtable.getObject(declaredField.code);
149
183
 
184
+ // Handle field types based on GNFieldDataType
150
185
  if (declaredField.gnFieldType == GNFieldDataType.String)
151
186
  {
152
187
  if (value == null) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
@@ -159,79 +194,107 @@
159
194
  }
160
195
  else if (declaredField.gnFieldType == GNFieldDataType.GNHashtable)
161
196
  {
197
+ // Handle nested objects
162
198
  if (value == null)
163
199
  {
164
200
  if (declaredField.defaultValue != null)
165
201
  {
166
- if (declaredField.fieldInfo.FieldType == typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
202
+ if (declaredField.fieldInfo.FieldType == this.typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
167
203
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IDictionary)) declaredField.fieldInfo.SetValue(answer, ((GNHashtable)(declaredField.defaultValue)).toData());
168
204
  else declaredField.fieldInfo.SetValue(answer, this.deserializeObject((GNHashtable)declaredField.defaultValue, declaredField.cls));
169
205
  }
170
206
  }
171
207
  else
172
208
  {
173
- if (declaredField.fieldInfo.FieldType == typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, value);
209
+ if (declaredField.fieldInfo.FieldType == this.typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, value);
174
210
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IDictionary)) declaredField.fieldInfo.SetValue(answer, ((IGNData)value).toData());
175
211
  else declaredField.fieldInfo.SetValue(answer, this.deserializeObject((GNHashtable)value, declaredField.cls));
176
212
  }
177
213
  }
178
214
  else if (declaredField.gnFieldType == GNFieldDataType.GNArray)
179
215
  {
216
+ // Handle arrays
180
217
  if (value == null)
181
218
  {
182
219
  if (declaredField.defaultValue != null)
183
220
  {
184
- if (declaredField.fieldInfo.FieldType == typeOfGNArray) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
221
+ if (declaredField.fieldInfo.FieldType == this.typeOfGNArray) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
185
222
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IList)) declaredField.fieldInfo.SetValue(answer, ((GNArray)declaredField.defaultValue).toData());
186
223
  }
187
224
  }
188
225
  else
189
226
  {
190
- if (declaredField.fieldInfo.FieldType == typeOfGNArray) declaredField.fieldInfo.SetValue(answer, value);
227
+ if (declaredField.fieldInfo.FieldType == this.typeOfGNArray) declaredField.fieldInfo.SetValue(answer, value);
191
228
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IList)) declaredField.fieldInfo.SetValue(answer, ((IGNData)value).toData());
192
229
  }
193
230
  }
194
231
  else if (declaredField.gnFieldType == GNFieldDataType.Number)
195
232
  {
196
- if (value == null) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
197
- else if (ConverterService.isNumber(value)) declaredField.fieldInfo.SetValue(answer, value);
233
+ object lastValue;
234
+
235
+ if (value == null) lastValue = declaredField.defaultValue;
236
+ else lastValue = value;
237
+
238
+ if (ConverterService.isNumber(lastValue))
239
+ {
240
+ if (TryGetNullable(declaredField.fieldInfo, out var tType))
241
+ {
242
+ var typeCode = Type.GetTypeCode(tType);
243
+
244
+ if (typeCode == TypeCode.SByte) declaredField.fieldInfo.SetValue(answer, Convert.ToSByte(lastValue));
245
+ else if (typeCode == TypeCode.Byte) declaredField.fieldInfo.SetValue(answer, Convert.ToByte(lastValue));
246
+ else if (typeCode == TypeCode.Int16) declaredField.fieldInfo.SetValue(answer, Convert.ToInt16(lastValue));
247
+ else if (typeCode == TypeCode.UInt16) declaredField.fieldInfo.SetValue(answer, Convert.ToUInt16(lastValue));
248
+ else if (typeCode == TypeCode.Int32) declaredField.fieldInfo.SetValue(answer, Convert.ToInt32(lastValue));
249
+ else if (typeCode == TypeCode.UInt32) declaredField.fieldInfo.SetValue(answer, Convert.ToUInt32(lastValue));
250
+ else if (typeCode == TypeCode.Int64) declaredField.fieldInfo.SetValue(answer, Convert.ToInt64(lastValue));
251
+ else if (typeCode == TypeCode.UInt64) declaredField.fieldInfo.SetValue(answer, Convert.ToUInt64(lastValue));
252
+ else if (typeCode == TypeCode.Single) declaredField.fieldInfo.SetValue(answer, Convert.ToSingle(lastValue));
253
+ else if (typeCode == TypeCode.Double) declaredField.fieldInfo.SetValue(answer, Convert.ToDouble(lastValue));
254
+ }
255
+ else
256
+ {
257
+ declaredField.fieldInfo.SetValue(answer, lastValue);
258
+ }
259
+ }
198
260
  }
199
261
  else
200
262
  {
263
+ // Handle other primitive types
201
264
  if (value == null)
202
265
  {
203
266
  if (declaredField.defaultValue != null)
204
267
  {
205
- if (declaredField.fieldInfo.FieldType == typeOfByte) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
206
- else if (declaredField.fieldInfo.FieldType == typeOfSByte) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
207
- else if (declaredField.fieldInfo.FieldType == typeOfShort) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
208
- else if (declaredField.fieldInfo.FieldType == typeOfInt) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
209
- else if (declaredField.fieldInfo.FieldType == typeOfFloat) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
210
- else if (declaredField.fieldInfo.FieldType == typeOfLong) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
211
- else if (declaredField.fieldInfo.FieldType == typeOfDouble) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
212
- else if (declaredField.fieldInfo.FieldType == typeOfBool) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
213
- else if (declaredField.fieldInfo.FieldType == typeOfString) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
214
- else if (declaredField.fieldInfo.FieldType == typeOfGNArray) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
268
+ if (declaredField.fieldInfo.FieldType == this.typeOfByte) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
269
+ else if (declaredField.fieldInfo.FieldType == this.typeOfSByte) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
270
+ else if (declaredField.fieldInfo.FieldType == this.typeOfShort) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
271
+ else if (declaredField.fieldInfo.FieldType == this.typeOfInt) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
272
+ else if (declaredField.fieldInfo.FieldType == this.typeOfFloat) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
273
+ else if (declaredField.fieldInfo.FieldType == this.typeOfLong) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
274
+ else if (declaredField.fieldInfo.FieldType == this.typeOfDouble) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
275
+ else if (declaredField.fieldInfo.FieldType == this.typeOfBool) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
276
+ else if (declaredField.fieldInfo.FieldType == this.typeOfString) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
277
+ else if (declaredField.fieldInfo.FieldType == this.typeOfGNArray) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
215
278
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IList)) declaredField.fieldInfo.SetValue(answer, ((IGNData)declaredField.defaultValue).toData());
216
- else if (declaredField.fieldInfo.FieldType == typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
279
+ else if (declaredField.fieldInfo.FieldType == this.typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, declaredField.defaultValue);
217
280
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IDictionary)) declaredField.fieldInfo.SetValue(answer, ((IGNData)declaredField.defaultValue).toData());
218
281
  else declaredField.fieldInfo.SetValue(answer, this.deserializeObject((GNHashtable)declaredField.defaultValue, declaredField.cls));
219
282
  }
220
283
  }
221
284
  else
222
285
  {
223
- if (declaredField.fieldInfo.FieldType == typeOfByte) declaredField.fieldInfo.SetValue(answer, value);
224
- else if (declaredField.fieldInfo.FieldType == typeOfSByte) declaredField.fieldInfo.SetValue(answer, value);
225
- else if (declaredField.fieldInfo.FieldType == typeOfShort) declaredField.fieldInfo.SetValue(answer, value);
226
- else if (declaredField.fieldInfo.FieldType == typeOfInt) declaredField.fieldInfo.SetValue(answer, value);
227
- else if (declaredField.fieldInfo.FieldType == typeOfFloat) declaredField.fieldInfo.SetValue(answer, value);
228
- else if (declaredField.fieldInfo.FieldType == typeOfLong) declaredField.fieldInfo.SetValue(answer, value);
229
- else if (declaredField.fieldInfo.FieldType == typeOfDouble) declaredField.fieldInfo.SetValue(answer, value);
230
- else if (declaredField.fieldInfo.FieldType == typeOfBool) declaredField.fieldInfo.SetValue(answer, value);
231
- else if (declaredField.fieldInfo.FieldType == typeOfString) declaredField.fieldInfo.SetValue(answer, value);
232
- else if (declaredField.fieldInfo.FieldType == typeOfGNArray) declaredField.fieldInfo.SetValue(answer, value);
286
+ if (declaredField.fieldInfo.FieldType == this.typeOfByte) declaredField.fieldInfo.SetValue(answer, value);
287
+ else if (declaredField.fieldInfo.FieldType == this.typeOfSByte) declaredField.fieldInfo.SetValue(answer, value);
288
+ else if (declaredField.fieldInfo.FieldType == this.typeOfShort) declaredField.fieldInfo.SetValue(answer, value);
289
+ else if (declaredField.fieldInfo.FieldType == this.typeOfInt) declaredField.fieldInfo.SetValue(answer, value);
290
+ else if (declaredField.fieldInfo.FieldType == this.typeOfFloat) declaredField.fieldInfo.SetValue(answer, value);
291
+ else if (declaredField.fieldInfo.FieldType == this.typeOfLong) declaredField.fieldInfo.SetValue(answer, value);
292
+ else if (declaredField.fieldInfo.FieldType == this.typeOfDouble) declaredField.fieldInfo.SetValue(answer, value);
293
+ else if (declaredField.fieldInfo.FieldType == this.typeOfBool) declaredField.fieldInfo.SetValue(answer, value);
294
+ else if (declaredField.fieldInfo.FieldType == this.typeOfString) declaredField.fieldInfo.SetValue(answer, value);
295
+ else if (declaredField.fieldInfo.FieldType == this.typeOfGNArray) declaredField.fieldInfo.SetValue(answer, value);
233
296
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IList)) declaredField.fieldInfo.SetValue(answer, ((IGNData)value).toData());
234
- else if (declaredField.fieldInfo.FieldType == typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, value);
297
+ else if (declaredField.fieldInfo.FieldType == this.typeOfGNHashtable) declaredField.fieldInfo.SetValue(answer, value);
235
298
  else if (declaredField.fieldInfo.FieldType == typeof(System.Collections.IDictionary)) declaredField.fieldInfo.SetValue(answer, ((IGNData)value).toData());
236
299
  else declaredField.fieldInfo.SetValue(answer, this.deserializeObject((GNHashtable)value, declaredField.cls));
237
300
  }
@@ -241,12 +304,19 @@
241
304
  return answer;
242
305
  }
243
306
 
307
+ /// <summary>
308
+ /// Deserializes a GNArray into a list of objects of the specified type.
309
+ /// </summary>
310
+ /// <param name="gnArray">The GNArray to deserialize.</param>
311
+ /// <param name="cls">The type of objects in the resulting list.</param>
312
+ /// <returns>A list of objects of the specified type.</returns>
244
313
  public System.Collections.IList deserializeArray(GNArray gnArray, Type cls)
245
314
  {
246
315
  if (gnArray == null) return null;
247
316
 
248
317
  var answer = new System.Collections.Generic.List<object>();
249
318
 
319
+ // Deserialize each element in the array
250
320
  for (var i = 0; i < gnArray.count(); i++)
251
321
  {
252
322
  var value = gnArray.getObject(i);
@@ -255,17 +325,17 @@
255
325
  {
256
326
  var typeOfValue = value.GetType();
257
327
 
258
- if (cls == typeOfByte) answer.Add(value);
259
- else if (cls == typeOfSByte) answer.Add(value);
260
- else if (cls == typeOfShort) answer.Add(value);
261
- else if (cls == typeOfInt) answer.Add(value);
262
- else if (cls == typeOfFloat) answer.Add(value);
263
- else if (cls == typeOfLong) answer.Add(value);
264
- else if (cls == typeOfDouble) answer.Add(value);
265
- else if (cls == typeOfBool) answer.Add(value);
266
- else if (cls == typeOfString) answer.Add(value);
267
- else if (cls == typeOfGNArray) answer.Add(value);
268
- else if (cls == typeOfGNHashtable) answer.Add(value);
328
+ if (cls == this.typeOfByte) answer.Add(value);
329
+ else if (cls == this.typeOfSByte) answer.Add(value);
330
+ else if (cls == this.typeOfShort) answer.Add(value);
331
+ else if (cls == this.typeOfInt) answer.Add(value);
332
+ else if (cls == this.typeOfFloat) answer.Add(value);
333
+ else if (cls == this.typeOfLong) answer.Add(value);
334
+ else if (cls == this.typeOfDouble) answer.Add(value);
335
+ else if (cls == this.typeOfBool) answer.Add(value);
336
+ else if (cls == this.typeOfString) answer.Add(value);
337
+ else if (cls == this.typeOfGNArray) answer.Add(value);
338
+ else if (cls == this.typeOfGNHashtable) answer.Add(value);
269
339
  else if (typeOfValue == typeof(System.Collections.IList))
270
340
  answer.Add(this.deserializeArray(gnArray.getGNArray(i), cls));
271
341
  else
@@ -276,6 +346,11 @@
276
346
  return answer;
277
347
  }
278
348
 
349
+ /// <summary>
350
+ /// Constructor for DeserializeConverter.
351
+ /// Initializes type mappings and field info mapper.
352
+ /// </summary>
353
+ /// <param name="dataMemberFieldInfoMapper">The mapper for field metadata.</param>
279
354
  public DeserializeConverter(DataMemberFieldInfoTypeMapper dataMemberFieldInfoMapper)
280
355
  {
281
356
  this.typeOfByte = typeof(byte);
@@ -294,30 +369,47 @@
294
369
  }
295
370
  }
296
371
 
372
+ /// <summary>
373
+ /// Class responsible for serializing objects and arrays into GNHashtable and GNArray.
374
+ /// </summary>
297
375
  internal class SerializeConverter
298
376
  {
377
+ // Mapper to retrieve metadata for fields with DataMember attributes.
299
378
  private DataMemberFieldInfoTypeMapper dataMemberFieldInfoMapper;
300
379
 
380
+ /// <summary>
381
+ /// Serializes an object into a GNHashtable.
382
+ /// </summary>
383
+ /// <param name="obj">The object to serialize.</param>
384
+ /// <returns>A GNHashtable representing the serialized object.</returns>
301
385
  public GNHashtable serializeObject(object obj)
302
386
  {
387
+ // Return null if the input object is null.
303
388
  if (obj == null) return null;
304
389
 
390
+ // Get the type of the input object.
305
391
  var type = obj.GetType();
306
392
 
393
+ // Retrieve metadata for all fields in the object's type.
307
394
  var declaredFields = this.dataMemberFieldInfoMapper.getGNEnhancedObjectFieldMetadata(type);
308
395
 
396
+ // Initialize the result GNHashtable.
309
397
  var answer = new GNHashtable();
310
398
 
399
+ // Iterate through each field and populate the GNHashtable.
311
400
  foreach (var declaredField in declaredFields)
312
401
  {
402
+ // Get the value of the field from the object.
313
403
  var value = declaredField.fieldInfo.GetValue(obj);
314
404
 
315
405
  if (value == null)
316
406
  {
407
+ // Add null value if the field is not optional.
317
408
  if (!declaredField.isOptional) answer.add(declaredField.code, null);
318
409
  }
319
410
  else
320
411
  {
412
+ // Handle serialization based on the GNFieldDataType.
321
413
  if (declaredField.gnFieldType == GNFieldDataType.String)
322
414
  {
323
415
  if (value is string) answer.add(declaredField.code, value);
@@ -328,21 +420,25 @@
328
420
  }
329
421
  else if (declaredField.gnFieldType == GNFieldDataType.GNHashtable)
330
422
  {
423
+ // Handle GNHashtable fields or nested objects.
331
424
  if (value is GNHashtable) answer.add(declaredField.code, value);
332
425
  else if (value is System.Collections.IDictionary valueDict) answer.add(declaredField.code, new GNHashtable.Builder().addAll(valueDict).build());
333
426
  else answer.add(declaredField.code, this.serializeObject(value));
334
427
  }
335
428
  else if (declaredField.gnFieldType == GNFieldDataType.GNArray)
336
429
  {
430
+ // Handle GNArray fields or lists.
337
431
  if (value is GNArray) answer.add(declaredField.code, value);
338
432
  else if (value is System.Collections.IList valueLst) answer.add(declaredField.code, this.serializeArray(valueLst));
339
433
  }
340
434
  else if (declaredField.gnFieldType == GNFieldDataType.Number)
341
435
  {
436
+ // Handle numeric fields.
342
437
  if (ConverterService.isNumber(value)) answer.add(declaredField.code, value);
343
438
  }
344
439
  else
345
440
  {
441
+ // Handle other types.
346
442
  if (value is string) answer.add(declaredField.code, value);
347
443
  else if (value is bool) answer.add(declaredField.code, value);
348
444
  else if (ConverterService.isNumber(value)) answer.add(declaredField.code, value);
@@ -357,12 +453,20 @@
357
453
  return answer;
358
454
  }
359
455
 
456
+ /// <summary>
457
+ /// Serializes a list into a GNArray.
458
+ /// </summary>
459
+ /// <param name="objLst">The list to serialize.</param>
460
+ /// <returns>A GNArray representing the serialized list.</returns>
360
461
  public GNArray serializeArray(System.Collections.IList objLst)
361
462
  {
463
+ // Return null if the input list is null.
362
464
  if (objLst == null) return null;
363
465
 
466
+ // Initialize the result GNArray.
364
467
  var answer = new GNArray();
365
468
 
469
+ // Iterate through each element in the list.
366
470
  for (var i = 0; i < objLst.Count; i++)
367
471
  {
368
472
  var obj = objLst[i];
@@ -379,55 +483,107 @@
379
483
  return answer;
380
484
  }
381
485
 
486
+ /// <summary>
487
+ /// Constructor for SerializeConverter.
488
+ /// </summary>
489
+ /// <param name="dataMemberFieldInfoMapper">The mapper for field metadata.</param>
382
490
  public SerializeConverter(DataMemberFieldInfoTypeMapper dataMemberFieldInfoMapper)
383
491
  {
384
492
  this.dataMemberFieldInfoMapper = dataMemberFieldInfoMapper;
385
493
  }
386
494
  }
387
495
 
496
+ /// <summary>
497
+ /// Service class providing serialization and deserialization functionality.
498
+ /// Handles conversion of objects to GNHashtable/GNArray and vice versa.
499
+ /// </summary>
388
500
  public class ConverterService
389
501
  {
502
+ // Private static instances for serialization and deserialization operations.
390
503
  private static SerializeConverter serializeConverter;
391
504
  private static DeserializeConverter deserializeConverter;
392
505
 
506
+ /// <summary>
507
+ /// Deserializes a GNHashtable into a strongly-typed object.
508
+ /// </summary>
509
+ /// <typeparam name="T">The target object type.</typeparam>
510
+ /// <param name="gnHashtable">The GNHashtable to deserialize.</param>
511
+ /// <returns>The deserialized object of type T.</returns>
393
512
  public static T deserializeObject<T>(GNHashtable gnHashtable)
394
513
  {
395
514
  return (T)ConverterService.deserializeObject(gnHashtable, typeof(T));
396
515
  }
397
516
 
517
+ /// <summary>
518
+ /// Deserializes a GNHashtable into an object of the specified type.
519
+ /// </summary>
520
+ /// <param name="gnHashtable">The GNHashtable to deserialize.</param>
521
+ /// <param name="cls">The type to deserialize into.</param>
522
+ /// <returns>The deserialized object.</returns>
398
523
  public static object deserializeObject(GNHashtable gnHashtable, Type cls)
399
524
  {
400
525
  return ConverterService.deserializeConverter.deserializeObject(gnHashtable, cls);
401
526
  }
402
527
 
528
+ /// <summary>
529
+ /// Deserializes a GNArray into a strongly-typed list.
530
+ /// </summary>
531
+ /// <typeparam name="T">The element type of the resulting list.</typeparam>
532
+ /// <param name="gnArray">The GNArray to deserialize.</param>
533
+ /// <returns>A list of deserialized elements.</returns>
403
534
  public static System.Collections.IList deserializeArray<T>(GNArray gnArray)
404
535
  {
405
536
  return ConverterService.deserializeArray<T>(gnArray);
406
537
  }
407
538
 
539
+ /// <summary>
540
+ /// Deserializes a GNArray into a list of a specified type.
541
+ /// </summary>
542
+ /// <param name="gnArray">The GNArray to deserialize.</param>
543
+ /// <param name="cls">The target element type.</param>
544
+ /// <returns>A list of deserialized elements.</returns>
408
545
  public static System.Collections.IList deserializeArray(GNArray gnArray, Type cls)
409
546
  {
410
547
  return ConverterService.deserializeConverter.deserializeArray(gnArray, cls);
411
548
  }
412
549
 
550
+ /// <summary>
551
+ /// Serializes an object into a GNHashtable.
552
+ /// </summary>
553
+ /// <param name="obj">The object to serialize.</param>
554
+ /// <returns>A GNHashtable representing the serialized object.</returns>
413
555
  public static GNHashtable serializeObject(object obj)
414
556
  {
415
557
  return ConverterService.serializeConverter.serializeObject(obj);
416
558
  }
417
559
 
560
+ /// <summary>
561
+ /// Serializes a list into a GNArray.
562
+ /// </summary>
563
+ /// <param name="objLst">The list to serialize.</param>
564
+ /// <returns>A GNArray representing the serialized list.</returns>
418
565
  public static GNArray serializeArray(System.Collections.IList objLst)
419
566
  {
420
567
  return ConverterService.serializeConverter.serializeArray(objLst);
421
568
  }
422
569
 
570
+ /// <summary>
571
+ /// Static constructor to initialize the SerializeConverter and DeserializeConverter instances.
572
+ /// </summary>
423
573
  static ConverterService()
424
574
  {
575
+ // Create a shared DataMemberFieldInfoTypeMapper for both converters.
425
576
  var dataMemberFieldInfoMapper = new DataMemberFieldInfoTypeMapper();
426
577
 
427
578
  ConverterService.serializeConverter = new SerializeConverter(dataMemberFieldInfoMapper);
428
579
  ConverterService.deserializeConverter = new DeserializeConverter(dataMemberFieldInfoMapper);
429
580
  }
430
581
 
582
+ /// <summary>
583
+ /// Checks if a value is a numeric type.
584
+ /// </summary>
585
+ /// <param name="value">The value to check.</param>
586
+ /// <returns>True if the value is a numeric type; otherwise, false.</returns>
431
587
  public static bool isNumber(object value)
432
588
  {
433
589
  return (value is byte
@@ -439,6 +595,11 @@
439
595
  || value is double);
440
596
  }
441
597
 
598
+ /// <summary>
599
+ /// Checks if a value is an integer type.
600
+ /// </summary>
601
+ /// <param name="value">The value to check.</param>
602
+ /// <returns>True if the value is an integer type; otherwise, false.</returns>
442
603
  public static bool isInteger(object value)
443
604
  {
444
605
  return (value is byte
@@ -449,4 +610,27 @@
449
610
  }
450
611
  }
451
612
 
613
+ public class ConverterServiceV2
614
+ {
615
+ class DetectSupport
616
+ {
617
+ public static bool isNumber(object value)
618
+ {
619
+ return value is byte
620
+ || value is sbyte
621
+ || value is short
622
+ || value is ushort
623
+ || value is int
624
+ || value is uint
625
+ || value is float
626
+ || value is long
627
+ || value is ulong
628
+ || value is double;
629
+ }
630
+
631
+ }
632
+
633
+
634
+ }
635
+
452
636
  }
@@ -1,11 +1,11 @@
1
- fileFormatVersion: 2
2
- guid: b8b58dc28f3badc45898106aa4ed0405
3
- MonoImporter:
4
- externalObjects: {}
5
- serializedVersion: 2
6
- defaultReferences: []
7
- executionOrder: 0
8
- icon: {instanceID: 0}
9
- userData:
10
- assetBundleName:
11
- assetBundleVariant:
1
+ fileFormatVersion: 2
2
+ guid: b8b58dc28f3badc45898106aa4ed0405
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: