MCPcopy Create free account
hub / github.com/apache/fory / readSingleValue

Method readSingleValue

go/fory/map.go:401–473  ·  view source on GitHub ↗

readSingleValue reads a single key or value with proper ref/type handling

(ctx *ReadContext, buf *ByteBuffer, ctxErr *Error, isDeclared, trackRef bool, staticType reflect.Type, declaredSer Serializer, resolver *TypeResolver, refResolver *RefResolver)

Source from the content-addressed store, hash-verified

399
400// readSingleValue reads a single key or value with proper ref/type handling
401func (s mapSerializer) readSingleValue(ctx *ReadContext, buf *ByteBuffer, ctxErr *Error, isDeclared, trackRef bool, staticType reflect.Type, declaredSer Serializer, resolver *TypeResolver, refResolver *RefResolver) reflect.Value {
402 // When ref tracking AND not declared, ref flag comes before type info
403 if trackRef && !isDeclared {
404 refID, err := refResolver.TryPreserveRefId(buf)
405 if err != nil {
406 ctx.SetError(FromError(err))
407 return reflect.Value{}
408 }
409 if refID < int32(NotNullValueFlag) {
410 return refResolver.GetReadObject(refID)
411 }
412
413 // Read type info and data
414 ti := resolver.ReadTypeInfo(buf, ctxErr)
415 if ctxErr.HasError() {
416 return reflect.Value{}
417 }
418
419 ser := ti.Serializer
420 valType := ti.Type
421 if valType == nil {
422 valType = staticType
423 }
424 valType, ser = wrapMapSerializerIfNeeded(staticType, valType, ser)
425 v := reflect.New(valType).Elem()
426 ser.ReadData(ctx, v)
427 if ctx.HasError() {
428 return reflect.Value{}
429 }
430 if _, ok := ser.(*ptrToValueSerializer); !ok {
431 refResolver.Reference(v)
432 }
433 return v
434 }
435
436 // Read type info if not declared
437 var typeInfo *TypeInfo
438 var ser Serializer
439 valType := staticType
440
441 if !isDeclared {
442 typeInfo = resolver.ReadTypeInfo(buf, ctxErr)
443 if ctxErr.HasError() {
444 return reflect.Value{}
445 }
446 ser = typeInfo.Serializer
447 valType = typeInfo.Type
448 valType, ser = wrapMapSerializerIfNeeded(staticType, valType, ser)
449 } else {
450 ser = declaredSer
451 if ser == nil {
452 ser, _ = resolver.getSerializerByType(staticType, false)
453 }
454 }
455
456 if valType == nil {
457 valType = staticType
458 }

Callers 2

readNullValueEntryMethod · 0.95
readNullKeyEntryMethod · 0.95

Calls 13

ReadDataMethod · 0.95
ReadWithTypeInfoMethod · 0.95
ReadMethod · 0.95
FromErrorFunction · 0.85
TryPreserveRefIdMethod · 0.80
GetReadObjectMethod · 0.80
getSerializerByTypeMethod · 0.80
int32Function · 0.50
SetErrorMethod · 0.45
ReadTypeInfoMethod · 0.45
HasErrorMethod · 0.45

Tested by

no test coverage detected