| 136 | } |
| 137 | |
| 138 | func (s *ptrToValueSerializer) ReadData(ctx *ReadContext, value reflect.Value) { |
| 139 | // Check if value is already allocated (for circular reference handling) |
| 140 | var newVal reflect.Value |
| 141 | if value.IsNil() { |
| 142 | // Allocate new value |
| 143 | newVal = reflect.New(value.Type().Elem()) |
| 144 | value.Set(newVal) |
| 145 | } else { |
| 146 | // Value already allocated (circular reference case) |
| 147 | newVal = value |
| 148 | } |
| 149 | |
| 150 | // Register the pointer for reference tracking BEFORE reading data |
| 151 | // This allows circular references to work correctly |
| 152 | ctx.RefResolver().Reference(value) |
| 153 | |
| 154 | s.valueSerializer.ReadData(ctx, newVal.Elem()) |
| 155 | } |
| 156 | |
| 157 | func (s *ptrToValueSerializer) Read(ctx *ReadContext, refMode RefMode, readType bool, hasGenerics bool, value reflect.Value) { |
| 158 | buf := ctx.Buffer() |