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

Method WriteValue

go/fory/writer.go:619–662  ·  view source on GitHub ↗

WriteValue writes a polymorphic value with configurable reference tracking and type info. This is used when the concrete type is not known at compile time. Parameters: - refMode: controls reference tracking behavior (RefModeNone, RefModeTracking, RefModeNullOnly) - writeType: if true, writes type in

(value reflect.Value, refMode RefMode, writeType bool)

Source from the content-addressed store, hash-verified

617// - refMode: controls reference tracking behavior (RefModeNone, RefModeTracking, RefModeNullOnly)
618// - writeType: if true, writes type info before the value
619func (c *WriteContext) WriteValue(value reflect.Value, refMode RefMode, writeType bool) {
620 // Handle interface values by getting their concrete element
621 if value.Kind() == reflect.Interface {
622 if !value.IsValid() || value.IsNil() {
623 c.buffer.WriteInt8(NullFlag)
624 return
625 }
626 value = value.Elem()
627 }
628
629 // Handle invalid values (nil interface)
630 if !value.IsValid() {
631 c.buffer.WriteInt8(NullFlag)
632 return
633 }
634
635 // Check for pointer to reference type (not allowed)
636 if value.Kind() == reflect.Ptr {
637 switch value.Elem().Kind() {
638 case reflect.Ptr, reflect.Map, reflect.Slice, reflect.Interface:
639 c.SetError(SerializationErrorf("pointer to reference type %s is not allowed", value.Type()))
640 return
641 }
642 }
643
644 // For array types, pre-convert the value to slice
645 if value.Kind() == reflect.Array {
646 length := value.Len()
647 sliceType := reflect.SliceOf(value.Type().Elem())
648 slice := reflect.MakeSlice(sliceType, length, length)
649 reflect.Copy(slice, value)
650 value = slice
651 }
652
653 // Get type information and serializer for the value
654 typeInfo, err := c.typeResolver.getTypeInfo(value, true)
655 if err != nil {
656 c.SetError(SerializationErrorf("cannot get typeinfo for value %v: %v", value, err))
657 return
658 }
659
660 // Use serializer's Write method which handles ref tracking and type info internally
661 typeInfo.Serializer.Write(c, refMode, writeType, false, value)
662}

Callers 8

WriteDataMethod · 0.80
WriteDataMethod · 0.80
writeRemainingFieldMethod · 0.80
SerializeMethod · 0.80
SerializeToMethod · 0.80
SerializeWithCallbackMethod · 0.80
serializeReflectValueMethod · 0.80
WriteTypedMethod · 0.80

Calls 8

SetErrorMethod · 0.95
SerializationErrorfFunction · 0.85
KindMethod · 0.80
LenMethod · 0.80
WriteMethod · 0.65
WriteInt8Method · 0.45
TypeMethod · 0.45
getTypeInfoMethod · 0.45

Tested by

no test coverage detected