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.
- package/Editor/GNServerSettingsEditor.cs +16 -300
- package/Runtime/Common/GNArray.cs +387 -302
- package/Runtime/Common/GNArray.cs.meta +11 -11
- package/Runtime/Common/GNData.cs +61 -48
- package/Runtime/Common/GNData.cs.meta +11 -11
- package/Runtime/Common/GNHashtable.cs +404 -241
- package/Runtime/Common/GNHashtable.cs.meta +11 -11
- package/Runtime/Common/IGNData.cs +20 -11
- package/Runtime/Common/IGNData.cs.meta +11 -11
- package/Runtime/Common.meta +8 -8
- package/Runtime/Config/GNServerSettings.cs +136 -92
- package/Runtime/Config/GNServerSettings.cs.meta +11 -11
- package/Runtime/Config.meta +8 -8
- package/Runtime/Constant/Commands.cs +82 -19
- package/Runtime/Constant/Commands.cs.meta +11 -11
- package/Runtime/Constant/EnumType/FriendStatus.cs +12 -12
- package/Runtime/Constant/EnumType/FriendStatus.cs.meta +11 -11
- package/Runtime/Constant/EnumType/GoogleLoginType.cs +5 -5
- package/Runtime/Constant/EnumType/GoogleLoginType.cs.meta +11 -11
- package/Runtime/Constant/EnumType/GroupStatus.cs +7 -7
- package/Runtime/Constant/EnumType/GroupStatus.cs.meta +11 -11
- package/Runtime/Constant/EnumType/InvalidMemberType.cs +23 -23
- package/Runtime/Constant/EnumType/InvalidMemberType.cs.meta +11 -11
- package/Runtime/Constant/EnumType/ItemType.cs +5 -5
- package/Runtime/Constant/EnumType/ItemType.cs.meta +11 -11
- package/Runtime/Constant/EnumType/MatchmakingMemberStatus.cs +6 -6
- package/Runtime/Constant/EnumType/MatchmakingMemberStatus.cs.meta +11 -11
- package/Runtime/Constant/EnumType/MatchmakingTicketStatus.cs +2 -2
- package/Runtime/Constant/EnumType/MatchmakingTicketStatus.cs.meta +11 -11
- package/Runtime/Constant/EnumType/OwnerType.cs +3 -2
- package/Runtime/Constant/EnumType/OwnerType.cs.meta +11 -11
- package/Runtime/Constant/EnumType/PermissionDataItem.cs +10 -10
- package/Runtime/Constant/EnumType/PermissionDataItem.cs.meta +11 -11
- package/Runtime/Constant/EnumType/PushPlatformType.cs +10 -0
- package/Runtime/Constant/EnumType/PushPlatformType.cs.meta +11 -0
- package/Runtime/Constant/EnumType/RequestRole.cs +11 -11
- package/Runtime/Constant/EnumType/RequestRole.cs.meta +7 -7
- package/Runtime/Constant/EnumType/RequestType.cs +20 -19
- package/Runtime/Constant/EnumType/RequestType.cs.meta +11 -11
- package/Runtime/Constant/EnumType/StoreReceiveType.cs +13 -0
- package/Runtime/Constant/EnumType/StoreReceiveType.cs.meta +11 -0
- package/Runtime/Constant/EnumType.meta +8 -8
- package/Runtime/Constant/ErrorCode/GNErrorCode.cs +53 -48
- package/Runtime/Constant/ErrorCode/GNErrorCode.cs.meta +7 -7
- package/Runtime/Constant/ErrorCode.meta +8 -8
- package/Runtime/Constant/EventCode.cs +43 -16
- package/Runtime/Constant/EventCode.cs.meta +11 -11
- package/Runtime/Constant/OperationCode.cs +249 -211
- package/Runtime/Constant/OperationCode.cs.meta +11 -11
- package/Runtime/Constant/ParameterCode/GNParameterCode.cs +610 -466
- package/Runtime/Constant/ParameterCode/GNParameterCode.cs.meta +11 -11
- package/Runtime/Constant/ParameterCode/ParameterCode.cs +12 -12
- package/Runtime/Constant/ParameterCode/ParameterCode.cs.meta +11 -11
- package/Runtime/Constant/ParameterCode.meta +8 -8
- package/Runtime/Constant/ReturnCode.cs +73 -25
- package/Runtime/Constant/ReturnCode.cs.meta +11 -11
- package/Runtime/Constant.meta +8 -8
- package/Runtime/Entity/DataMember.cs +342 -124
- package/Runtime/Entity/DataMember.cs.meta +11 -11
- package/Runtime/Entity/GNMetadata.cs +72 -27
- package/Runtime/Entity/GNMetadata.cs.meta +11 -11
- package/Runtime/Entity/InvalidMember.cs +52 -33
- package/Runtime/Entity/InvalidMember.cs.meta +11 -11
- package/Runtime/Entity/Models/AuthenticateModels.cs +251 -207
- package/Runtime/Entity/Models/AuthenticateModels.cs.meta +11 -11
- package/Runtime/Entity/Models/AuthenticateRequestModels.cs +153 -131
- package/Runtime/Entity/Models/AuthenticateRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/AuthenticateResponseModels.cs +61 -51
- package/Runtime/Entity/Models/AuthenticateResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/CharacterPlayerModels.cs +985 -849
- package/Runtime/Entity/Models/CharacterPlayerModels.cs.meta +11 -11
- package/Runtime/Entity/Models/CharacterPlayerRequestModels.cs +957 -885
- package/Runtime/Entity/Models/CharacterPlayerRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/CharacterPlayerResponseModels.cs +165 -150
- package/Runtime/Entity/Models/CharacterPlayerResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/CloudScriptModels.cs +185 -0
- package/Runtime/Entity/Models/CloudScriptModels.cs.meta +11 -0
- package/Runtime/Entity/Models/CloudScriptRequestModels.cs +134 -0
- package/Runtime/Entity/Models/CloudScriptRequestModels.cs.meta +11 -0
- package/Runtime/Entity/Models/CloudScriptResponseModels.cs +34 -0
- package/Runtime/Entity/Models/CloudScriptResponseModels.cs.meta +11 -0
- package/Runtime/Entity/Models/ContentModels.cs +150 -153
- package/Runtime/Entity/Models/ContentModels.cs.meta +11 -11
- package/Runtime/Entity/Models/ContentRequestModels.cs +129 -129
- package/Runtime/Entity/Models/ContentRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/ContentResponseModels.cs +24 -24
- package/Runtime/Entity/Models/ContentResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/DashboardModels.cs +1684 -1156
- package/Runtime/Entity/Models/DashboardModels.cs.meta +11 -11
- package/Runtime/Entity/Models/DashboardRequestModels.cs +220 -147
- package/Runtime/Entity/Models/DashboardRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/DashboardResponseModels.cs +92 -57
- package/Runtime/Entity/Models/DashboardResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GamePlayerModels.cs +1073 -933
- package/Runtime/Entity/Models/GamePlayerModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GamePlayerRequestModels.cs +939 -867
- package/Runtime/Entity/Models/GamePlayerRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GamePlayerResponseModels.cs +162 -147
- package/Runtime/Entity/Models/GamePlayerResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GenericModels.cs +102 -102
- package/Runtime/Entity/Models/GenericModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GroupModels.cs +812 -676
- package/Runtime/Entity/Models/GroupModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GroupRequestModels.cs +741 -669
- package/Runtime/Entity/Models/GroupRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/GroupResponseModels.cs +129 -114
- package/Runtime/Entity/Models/GroupResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/InventoryModels.cs +667 -558
- package/Runtime/Entity/Models/InventoryModels.cs.meta +11 -11
- package/Runtime/Entity/Models/InventoryRequestModels.cs +626 -579
- package/Runtime/Entity/Models/InventoryRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/InventoryResponseModels.cs +109 -99
- package/Runtime/Entity/Models/InventoryResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MasterPlayerModels.cs +1882 -1340
- package/Runtime/Entity/Models/MasterPlayerModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MasterPlayerRequestModels.cs +1643 -1253
- package/Runtime/Entity/Models/MasterPlayerRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MasterPlayerResponseModels.cs +293 -213
- package/Runtime/Entity/Models/MasterPlayerResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MultiplayerModels.cs +293 -223
- package/Runtime/Entity/Models/MultiplayerModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MultiplayerRequestModels.cs +199 -149
- package/Runtime/Entity/Models/MultiplayerRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/MultiplayerResponseModels.cs +59 -49
- package/Runtime/Entity/Models/MultiplayerResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models/StoreInventoryModels.cs +514 -323
- package/Runtime/Entity/Models/StoreInventoryModels.cs.meta +11 -11
- package/Runtime/Entity/Models/StoreInventoryRequestModels.cs +236 -165
- package/Runtime/Entity/Models/StoreInventoryRequestModels.cs.meta +11 -11
- package/Runtime/Entity/Models/StoreInventoryResponseModels.cs +45 -30
- package/Runtime/Entity/Models/StoreInventoryResponseModels.cs.meta +11 -11
- package/Runtime/Entity/Models.meta +8 -8
- package/Runtime/Entity/OperationEvent.cs +111 -75
- package/Runtime/Entity/OperationEvent.cs.meta +11 -11
- package/Runtime/Entity/OperationHelper.cs +51 -35
- package/Runtime/Entity/OperationHelper.cs.meta +11 -11
- package/Runtime/Entity/OperationRequest.cs +142 -99
- package/Runtime/Entity/OperationRequest.cs.meta +11 -11
- package/Runtime/Entity/OperationResponse.cs +111 -63
- package/Runtime/Entity/OperationResponse.cs.meta +11 -11
- package/Runtime/Entity/Request/CustomOperationRequest.cs +112 -61
- package/Runtime/Entity/Request/CustomOperationRequest.cs.meta +11 -11
- package/Runtime/Entity/Request.meta +8 -8
- package/Runtime/Entity/Response/CustomOperationResponse.cs +84 -63
- package/Runtime/Entity/Response/CustomOperationResponse.cs.meta +11 -11
- package/Runtime/Entity/Response.meta +8 -8
- package/Runtime/Entity.meta +8 -8
- package/Runtime/GNNetwork.cs +496 -182
- package/Runtime/GNNetwork.cs.meta +11 -11
- package/Runtime/GNNetworkApi.cs +38 -19
- package/Runtime/GNNetworkApi.cs.meta +11 -11
- package/Runtime/GNNetworkAuthenticateApi.cs +531 -98
- package/Runtime/GNNetworkAuthenticateApi.cs.meta +11 -11
- package/Runtime/GNNetworkCharacterPlayerApi.cs +1587 -762
- package/Runtime/GNNetworkCharacterPlayerApi.cs.meta +11 -11
- package/Runtime/GNNetworkCloudScriptApi.cs +181 -0
- package/Runtime/GNNetworkCloudScriptApi.cs.meta +11 -0
- package/Runtime/GNNetworkContentApi.cs +238 -132
- package/Runtime/GNNetworkContentApi.cs.meta +11 -11
- package/Runtime/GNNetworkDashboardApi.cs +278 -117
- package/Runtime/GNNetworkDashboardApi.cs.meta +11 -11
- package/Runtime/GNNetworkGamePlayerApi.cs +1558 -747
- package/Runtime/GNNetworkGamePlayerApi.cs.meta +11 -11
- package/Runtime/GNNetworkGroupApi.cs +1228 -582
- package/Runtime/GNNetworkGroupApi.cs.meta +11 -11
- package/Runtime/GNNetworkInventoryApi.cs +1048 -507
- package/Runtime/GNNetworkInventoryApi.cs.meta +11 -11
- package/Runtime/GNNetworkMasterPlayerApi.cs +2586 -1067
- package/Runtime/GNNetworkMasterPlayerApi.cs.meta +11 -11
- package/Runtime/GNNetworkMultiplayerApi.cs +328 -147
- package/Runtime/GNNetworkMultiplayerApi.cs.meta +11 -11
- package/Runtime/GNNetworkStoreInventoryApi.cs +388 -162
- package/Runtime/GNNetworkStoreInventoryApi.cs.meta +11 -11
- package/Runtime/Helper/CodeHelper.cs +140 -98
- package/Runtime/Helper/CodeHelper.cs.meta +11 -11
- package/Runtime/Helper/ConverterService.cs +236 -52
- package/Runtime/Helper/ConverterService.cs.meta +11 -11
- package/Runtime/Helper/ParseGNHelper.cs +451 -451
- package/Runtime/Helper/ParseGNHelper.cs.meta +11 -11
- package/Runtime/Helper.meta +8 -8
- package/Runtime/Logger/GNDebug.cs +92 -49
- package/Runtime/Logger/GNDebug.cs.meta +11 -11
- package/Runtime/Logger.meta +8 -8
- package/Runtime/Networking/AuthenticateStatus.cs +57 -35
- package/Runtime/Networking/AuthenticateStatus.cs.meta +11 -11
- package/Runtime/Networking/Handler/IServerEventHandler.cs +25 -25
- package/Runtime/Networking/Handler/IServerEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnCharacterPlayerFriendUpdateEventHandler.cs +61 -32
- package/Runtime/Networking/Handler/OnCharacterPlayerFriendUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnCharacterPlayerGroupUpdateEventHandler.cs +54 -33
- package/Runtime/Networking/Handler/OnCharacterPlayerGroupUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnGamePlayerFriendUpdateEventHandler.cs +54 -32
- package/Runtime/Networking/Handler/OnGamePlayerFriendUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnGamePlayerGroupUpdateEventHandler.cs +54 -32
- package/Runtime/Networking/Handler/OnGamePlayerGroupUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnGroupMemberUpdateEventHandler.cs +48 -29
- package/Runtime/Networking/Handler/OnGroupMemberUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler/OnGroupMessageUpdateEventHandler.cs +47 -29
- package/Runtime/Networking/Handler/OnGroupMessageUpdateEventHandler.cs.meta +11 -11
- package/Runtime/Networking/Handler.meta +8 -8
- package/Runtime/Networking/Http/HttpPeer.cs +68 -25
- package/Runtime/Networking/Http/HttpPeer.cs.meta +11 -11
- package/Runtime/Networking/Http/NetworkingHttpPeerBase.cs +65 -25
- package/Runtime/Networking/Http/NetworkingHttpPeerBase.cs.meta +11 -11
- package/Runtime/Networking/Http/NetworkingPeerHttpClientRequest.cs +513 -486
- package/Runtime/Networking/Http/NetworkingPeerHttpClientRequest.cs.meta +11 -11
- package/Runtime/Networking/Http/NetworkingPeerHttpRequest.cs +172 -142
- package/Runtime/Networking/Http/NetworkingPeerHttpRequest.cs.meta +11 -11
- package/Runtime/Networking/Http/NetworkingPeerUnityWebRequest.cs +225 -188
- package/Runtime/Networking/Http/NetworkingPeerUnityWebRequest.cs.meta +11 -11
- package/Runtime/Networking/Http.meta +8 -8
- package/Runtime/Networking/IPeer.cs +41 -19
- package/Runtime/Networking/IPeer.cs.meta +11 -11
- package/Runtime/Networking/NetworkingPeer.cs +198 -144
- package/Runtime/Networking/NetworkingPeer.cs.meta +11 -11
- package/Runtime/Networking/NetworkingPeerAPI.cs +20 -21
- package/Runtime/Networking/NetworkingPeerAPI.cs.meta +11 -11
- package/Runtime/Networking/OperationPending.cs +159 -95
- package/Runtime/Networking/OperationPending.cs.meta +11 -11
- package/Runtime/Networking/PeerBase.cs +305 -242
- package/Runtime/Networking/PeerBase.cs.meta +11 -11
- package/Runtime/Networking/Socket/NetworkingPeerSocketV2.cs +222 -185
- package/Runtime/Networking/Socket/NetworkingPeerSocketV2.cs.meta +11 -11
- package/Runtime/Networking/Socket/NetworkingPeerSocketV3.cs +235 -177
- package/Runtime/Networking/Socket/NetworkingPeerSocketV3.cs.meta +11 -11
- package/Runtime/Networking/Socket/NetworkingSocketPeerBase.cs +165 -23
- package/Runtime/Networking/Socket/NetworkingSocketPeerBase.cs.meta +11 -11
- package/Runtime/Networking/Socket/SocketPeer.cs +242 -197
- package/Runtime/Networking/Socket/SocketPeer.cs.meta +11 -11
- package/Runtime/Networking/Socket.meta +8 -8
- package/Runtime/Networking.meta +8 -8
- package/Runtime/Unity/ServiceCoroutine.cs +10 -0
- package/Runtime/Unity/ServiceCoroutine.cs.meta +11 -0
- package/Runtime/Unity/ServiceUpdate.cs +33 -20
- package/Runtime/Unity/ServiceUpdate.cs.meta +11 -11
- package/Runtime/Unity.meta +8 -8
- package/Runtime/XmobiTea.GN.runtime.asmdef +16 -16
- package/Runtime/XmobiTea.GN.runtime.asmdef.meta +7 -7
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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:
|