(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value)
| 1312 | } |
| 1313 | |
| 1314 | func (s *structSerializer) Read(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value) { |
| 1315 | buf := ctx.Buffer() |
| 1316 | ctxErr := ctx.Err() |
| 1317 | switch refMode { |
| 1318 | case RefModeTracking: |
| 1319 | refID, refErr := ctx.RefResolver().TryPreserveRefId(buf) |
| 1320 | if refErr != nil { |
| 1321 | ctx.SetError(FromError(refErr)) |
| 1322 | return |
| 1323 | } |
| 1324 | if refID < int32(NotNullValueFlag) { |
| 1325 | // Reference found |
| 1326 | obj := ctx.RefResolver().GetReadObject(refID) |
| 1327 | if obj.IsValid() { |
| 1328 | value.Set(obj) |
| 1329 | } |
| 1330 | return |
| 1331 | } |
| 1332 | case RefModeNullOnly: |
| 1333 | flag := buf.ReadInt8(ctxErr) |
| 1334 | if flag == NullFlag { |
| 1335 | return |
| 1336 | } |
| 1337 | } |
| 1338 | if readType { |
| 1339 | if s.type_ != nil { |
| 1340 | serializer := ctx.TypeResolver().ReadTypeInfoForType(buf, s.type_, ctxErr) |
| 1341 | if ctxErr.HasError() { |
| 1342 | return |
| 1343 | } |
| 1344 | if serializer == nil { |
| 1345 | ctx.SetError(DeserializationError("unexpected type id for struct")) |
| 1346 | return |
| 1347 | } |
| 1348 | if structSer, ok := serializer.(*structSerializer); ok && len(structSer.fieldDefs) > 0 { |
| 1349 | structSer.ReadData(ctx, value) |
| 1350 | return |
| 1351 | } |
| 1352 | s.ReadData(ctx, value) |
| 1353 | return |
| 1354 | } |
| 1355 | // Fallback: read type info when expected type is unknown |
| 1356 | typeInfo := ctx.TypeResolver().ReadTypeInfo(buf, ctxErr) |
| 1357 | if ctxErr.HasError() { |
| 1358 | return |
| 1359 | } |
| 1360 | if typeInfo != nil { |
| 1361 | if structSer, ok := typeInfo.Serializer.(*structSerializer); ok && len(structSer.fieldDefs) > 0 { |
| 1362 | structSer.ReadData(ctx, value) |
| 1363 | return |
| 1364 | } |
| 1365 | } |
| 1366 | } |
| 1367 | s.ReadData(ctx, value) |
| 1368 | } |
| 1369 | |
| 1370 | func (s *structSerializer) ReadWithTypeInfo(ctx *ReadContext, refMode RefMode, typeInfo *TypeInfo, value reflect.Value) { |
| 1371 | // typeInfo is already read, don't read it again |
no test coverage detected