@@ -192,43 +192,52 @@ function TRTTIYaml.DeserializeDynArray(aTypeInfo: PTypeInfo; aObject: TObject; c
192
192
TValue.Make(@pArr,aTypeInfo, Result);
193
193
rDynArray := ctx.GetType(Result.TypeInfo) as TRTTIDynamicArrayType;
194
194
195
- for i := 0 to aYamlArray.Count - 1 do
196
- begin
197
- rItemValue := nil ;
198
- case rType.Kind of
199
- tkClass :
200
- begin
201
- if TYamlPair(aYamlArray.Items[i]).Value is TYamlObject then
195
+ try
196
+ for i := 0 to aYamlArray.Count - 1 do
197
+ begin
198
+ rItemValue := nil ;
199
+ case rType.Kind of
200
+ tkClass :
202
201
begin
203
- Yaml := TYamlObject(TYamlPair(aYamlArray.Items[i]).value );
204
- propObj := GetValue(PPByte(Result.GetReferenceToRawData)^ +rDynArray.ElementType.TypeSize * i, rDynArray.ElementType).AsObject;
205
- if propObj = nil then
206
- begin
207
- objClass := rType.TypeData.ClassType;
208
- rItemValue := DeserializeClass(objClass,yaml);
209
- end
210
- else
202
+ if aYamlArray.Items[i] = nil then raise Exception.Create(' Value empty!' );
203
+
204
+ if TYamlPair(aYamlArray.Items[i]).Value is TYamlObject then
211
205
begin
212
- DeserializeObject(propObj,yaml);
206
+ Yaml := TYamlObject(TYamlPair(aYamlArray.Items[i]).value );
207
+ propObj := GetValue(PPByte(Result.GetReferenceToRawData)^ +rDynArray.ElementType.TypeSize * i, rDynArray.ElementType).AsObject;
208
+ if propObj = nil then
209
+ begin
210
+ objClass := rType.TypeData.ClassType;
211
+ rItemValue := DeserializeClass(objClass,yaml);
212
+ end
213
+ else
214
+ begin
215
+ DeserializeObject(propObj,yaml);
216
+ end ;
213
217
end ;
214
218
end ;
215
- end ;
216
- tkRecord :
219
+ tkRecord :
220
+ begin
221
+ Yaml := TYamlObject(TYamlPair(aYamlArray.Items[i]).value );
222
+ rItemValue := DeserializeRecord(GetValue(PPByte(Result.GetReferenceToRawData)^ +rDynArray.ElementType.TypeSize * i,
223
+ rDynArray.ElementType),aObject,Yaml);
224
+ end ;
225
+ tkMethod, tkPointer, tkClassRef ,tkInterface, tkProcedure :
226
+ begin
227
+ // skip these properties
228
+ end
229
+ else
217
230
begin
218
- Yaml := TYamlObject(TYamlPair(aYamlArray.Items[i]).value );
219
- rItemValue := DeserializeRecord(GetValue(PPByte(Result.GetReferenceToRawData)^ +rDynArray.ElementType.TypeSize * i,
220
- rDynArray.ElementType),aObject,Yaml);
231
+ rItemValue := DeserializeType(aObject,rType.Kind,rType,aYamlArray.Items[i].Value );
221
232
end ;
222
- tkMethod, tkPointer, tkClassRef ,tkInterface, tkProcedure :
223
- begin
224
- // skip these properties
225
- end
226
- else
227
- begin
228
- rItemValue := DeserializeType(aObject,rType.Kind,rType,aYamlArray.Items[i].Value );
229
233
end ;
234
+ if not rItemValue.IsEmpty then Result.SetArrayElement(i,rItemValue);
235
+ end ;
236
+ except
237
+ on E : Exception do
238
+ begin
239
+ raise Exception.CreateFmt(' Array %s item %d error (%s)' ,[rtype.Name , i, e.Message]);
230
240
end ;
231
- if not rItemValue.IsEmpty then Result.SetArrayElement(i,rItemValue);
232
241
end ;
233
242
// aProperty.SetValue(aObject,rValue);
234
243
finally
0 commit comments