in object.go [567:648]
func (d *Decoder) decObject(flag int32) (interface{}, error) {
var (
tag byte
idx int32
err error
typ reflect.Type
cls *ClassInfo
)
if flag != TAG_READ {
tag = byte(flag)
} else {
tag, _ = d.ReadByte()
}
switch {
case tag == BC_NULL:
return nil, nil
case tag == BC_REF:
return d.decRef(int32(tag))
case tag == BC_OBJECT_DEF:
clsDef, decErr := d.decClassDef()
if decErr != nil {
return nil, perrors.Wrap(decErr, "decObject->decClassDef byte double")
}
cls, _ = clsDef.(*ClassInfo)
// add to slice
d.appendClsDef(cls)
return d.DecodeValue()
case tag == BC_OBJECT:
idx, err = d.decInt32(TAG_READ)
if err != nil {
return nil, err
}
typ, cls, err = d.getStructDefByIndex(int(idx))
if err != nil {
return nil, err
}
if typ == nil {
if d.isSkip {
return nil, d.skip(cls)
}
return d.decClassToMap(cls)
}
if typ.Implements(javaEnumType) {
return d.decEnum(cls.javaName, TAG_READ)
}
if c, ok := GetSerializer(cls.javaName); ok {
return c.DecObject(d, typ, cls)
}
return d.decInstance(typ, cls)
case BC_OBJECT_DIRECT <= tag && tag <= (BC_OBJECT_DIRECT+OBJECT_DIRECT_MAX):
typ, cls, err = d.getStructDefByIndex(int(tag - BC_OBJECT_DIRECT))
if err != nil {
return nil, err
}
if typ == nil {
if d.isSkip {
return nil, d.skip(cls)
}
return d.decClassToMap(cls)
}
if typ.Implements(javaEnumType) {
return d.decEnum(cls.javaName, TAG_READ)
}
if c, ok := GetSerializer(cls.javaName); ok {
return c.DecObject(d, typ, cls)
}
return d.decInstance(typ, cls)
default:
return nil, perrors.Errorf("decObject illegal object type tag:%+v", tag)
}
}