func()

in go/fury/fury.go [408:474]


func (f *Fury) readData(buffer *ByteBuffer, value reflect.Value, serializer Serializer) (err error) {
	typeId := buffer.ReadInt16()
	if typeId != NotSupportCrossLanguage {
		var type_ reflect.Type
		if typeId == FURY_TYPE_TAG {
			type_, err = f.typeResolver.readTypeByReadTag(buffer)
			if err != nil {
				return err
			}
		}
		if typeId < NotSupportCrossLanguage {
			if f.peerLanguage != GO {
				// skip peer language specific type info
				_, err = f.typeResolver.readTypeInfo(buffer)
				if err != nil {
					return err
				}
				type_, err = f.typeResolver.getTypeById(-typeId)
				if err != nil {
					return err
				}
			} else {
				type_, err = f.typeResolver.readType(buffer)
				if err != nil {
					return err
				}
			}
		} else {
			if typeId != FURY_TYPE_TAG {
				type_, err = f.typeResolver.getTypeById(typeId)
				if err != nil {
					return err
				}
			}
		}
		if serializer == nil {
			serializer, err = f.typeResolver.getSerializerByType(type_)
			if err != nil {
				return err
			}
		}
		// `type_` may be more concrete than `value.Type()`. For example, `value.Type()` may be interface type.
		// in serializers.
		if value.Kind() == reflect.Interface {
			// interfaceValue.Elem is not addressable, so we don't invoke `Elem` on interface. We create a new
			// addressable concreate value to populate instead. Otherwise, we will need to handle interface in
			// every serializers.
			newValue := reflect.New(type_).Elem()
			err := serializer.Read(f, buffer, type_, newValue)
			if err != nil {
				return err
			}
			value.Set(newValue)
			return nil
		} else {
			// handle value nil in the serializers since default value of most types are not nil
			// and for nil, those values are composite values, check is cheap.
			return serializer.Read(f, buffer, type_, value)
		}
	} else {
		typeInfo, err := f.typeResolver.readTypeInfo(buffer)
		if err != nil {
			return err
		}
		return fmt.Errorf("native objects of type %s not supported for now", typeInfo)
	}
}