| 95 | } |
| 96 | |
| 97 | func (s *UnionSerializer) initialize(typeResolver *TypeResolver) error { |
| 98 | if s.initialized { |
| 99 | return s.initErr |
| 100 | } |
| 101 | if s.initErr != nil { |
| 102 | return s.initErr |
| 103 | } |
| 104 | for i := range s.cases { |
| 105 | info := &s.cases[i] |
| 106 | var serializer Serializer |
| 107 | var err error |
| 108 | if info.spec != nil { |
| 109 | serializer, err = serializerForTypeSpec(typeResolver, info.type_, info.spec) |
| 110 | info.declaredValue = true |
| 111 | } else { |
| 112 | serializer, err = typeResolver.getSerializerByType(info.type_, false) |
| 113 | } |
| 114 | if err != nil { |
| 115 | return err |
| 116 | } |
| 117 | info.serializer = serializer |
| 118 | defaultTypeId := typeResolver.getTypeIdByType(info.type_) |
| 119 | if defaultTypeId == 0 { |
| 120 | base := info.type_ |
| 121 | if base.Kind() == reflect.Ptr { |
| 122 | base = base.Elem() |
| 123 | } |
| 124 | defaultTypeId = typeIdFromKind(base) |
| 125 | } |
| 126 | info.needsOverride = needsUnionEncodingOverride(info.type_, info.typeID, defaultTypeId) |
| 127 | } |
| 128 | s.initialized = true |
| 129 | return nil |
| 130 | } |
| 131 | |
| 132 | // Write is the entry point for union serialization. |
| 133 | func (s *UnionSerializer) Write(ctx *WriteContext, refMode RefMode, writeType bool, hasGenerics bool, value reflect.Value) { |