上传编解码库 mapstring 扩展

This commit is contained in:
liwei1dao 2022-07-11 17:11:08 +08:00
parent c79db39d2b
commit 2c7bcad214
4 changed files with 122 additions and 55 deletions

View File

@ -10,8 +10,8 @@ import (
"github.com/modern-go/reflect2" "github.com/modern-go/reflect2"
) )
func newSys(options core.Options) (sys *codec, err error) { func newSys(options core.Options) (sys *Codec, err error) {
sys = &codec{ sys = &Codec{
options: &options, options: &options,
decoderCache: new(sync.Map), decoderCache: new(sync.Map),
encoderCache: new(sync.Map), encoderCache: new(sync.Map),
@ -29,7 +29,7 @@ func newSys(options core.Options) (sys *codec, err error) {
return return
} }
type codec struct { type Codec struct {
options *core.Options options *core.Options
decoderCache *sync.Map decoderCache *sync.Map
encoderCache *sync.Map encoderCache *sync.Map
@ -37,39 +37,18 @@ type codec struct {
extraPool *sync.Pool extraPool *sync.Pool
} }
func (this *codec) Options() *core.Options { func (this *Codec) Options() *core.Options {
return this.options return this.options
} }
//序列化Josn func (this *Codec) addDecoderToCache(cacheKey uintptr, decoder core.IDecoder) {
func (this *codec) MarshalJson(val interface{}, option ...core.ExecuteOption) (buf []byte, err error) {
stream := this.BorrowStream()
defer this.ReturnStream(stream)
stream.WriteVal(val)
if stream.Error() != nil {
return nil, stream.Error()
}
result := stream.Buffer()
copied := make([]byte, len(result))
copy(copied, result)
return copied, nil
}
func (this *codec) UnmarshalJson(data []byte, v interface{}) error {
extra := this.BorrowExtractor(data)
defer this.ReturnExtractor(extra)
extra.ReadVal(v)
return extra.Error()
}
func (this *codec) addDecoderToCache(cacheKey uintptr, decoder core.IDecoder) {
this.decoderCache.Store(cacheKey, decoder) this.decoderCache.Store(cacheKey, decoder)
} }
func (this *codec) addEncoderToCache(cacheKey uintptr, encoder core.IEncoder) { func (this *Codec) addEncoderToCache(cacheKey uintptr, encoder core.IEncoder) {
this.encoderCache.Store(cacheKey, encoder) this.encoderCache.Store(cacheKey, encoder)
} }
func (this *codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder { func (this *Codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder {
encoder, found := this.encoderCache.Load(cacheKey) encoder, found := this.encoderCache.Load(cacheKey)
if found { if found {
return encoder.(core.IEncoder) return encoder.(core.IEncoder)
@ -77,7 +56,7 @@ func (this *codec) GetEncoderFromCache(cacheKey uintptr) core.IEncoder {
return nil return nil
} }
func (this *codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder { func (this *Codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder {
decoder, found := this.decoderCache.Load(cacheKey) decoder, found := this.decoderCache.Load(cacheKey)
if found { if found {
return decoder.(core.IDecoder) return decoder.(core.IDecoder)
@ -85,7 +64,7 @@ func (this *codec) GetDecoderFromCache(cacheKey uintptr) core.IDecoder {
return nil return nil
} }
func (this *codec) EncoderOf(typ reflect2.Type) core.IEncoder { func (this *Codec) EncoderOf(typ reflect2.Type) core.IEncoder {
cacheKey := typ.RType() cacheKey := typ.RType()
encoder := this.GetEncoderFromCache(cacheKey) encoder := this.GetEncoderFromCache(cacheKey)
if encoder != nil { if encoder != nil {
@ -105,7 +84,7 @@ func (this *codec) EncoderOf(typ reflect2.Type) core.IEncoder {
return encoder return encoder
} }
func (this *codec) DecoderOf(typ reflect2.Type) core.IDecoder { func (this *Codec) DecoderOf(typ reflect2.Type) core.IDecoder {
cacheKey := typ.RType() cacheKey := typ.RType()
decoder := this.GetDecoderFromCache(cacheKey) decoder := this.GetDecoderFromCache(cacheKey)
if decoder != nil { if decoder != nil {
@ -123,57 +102,89 @@ func (this *codec) DecoderOf(typ reflect2.Type) core.IDecoder {
return decoder return decoder
} }
func (this *codec) BorrowStream() core.IStream { func (this *Codec) BorrowStream() core.IStream {
stream := this.streamPool.Get().(core.IStream) stream := this.streamPool.Get().(core.IStream)
return stream return stream
} }
func (this *codec) ReturnStream(stream core.IStream) { func (this *Codec) ReturnStream(stream core.IStream) {
this.streamPool.Put(stream) this.streamPool.Put(stream)
} }
func (this *codec) BorrowExtractor(buf []byte) core.IExtractor { func (this *Codec) BorrowExtractor(buf []byte) core.IExtractor {
extra := this.extraPool.Get().(core.IExtractor) extra := this.extraPool.Get().(core.IExtractor)
extra.ResetBytes(buf) extra.ResetBytes(buf)
return extra return extra
} }
func (this *codec) ReturnExtractor(extra core.IExtractor) { func (this *Codec) ReturnExtractor(extra core.IExtractor) {
this.extraPool.Put(extra) this.extraPool.Put(extra)
} }
//编码对象到json
func (this *Codec) MarshalJson(val interface{}, option ...core.ExecuteOption) (buf []byte, err error) {
stream := this.BorrowStream()
defer this.ReturnStream(stream)
stream.WriteVal(val)
if stream.Error() != nil {
return nil, stream.Error()
}
result := stream.Buffer()
copied := make([]byte, len(result))
copy(copied, result)
return copied, nil
}
//解码json到对象
func (this *Codec) UnmarshalJson(data []byte, v interface{}) error {
extra := this.BorrowExtractor(data)
defer this.ReturnExtractor(extra)
extra.ReadVal(v)
return extra.Error()
}
//编码对象到mapjson
func (this *Codec) MarshalMapJson(val interface{}, option ...core.ExecuteOption) (ret map[string]string, err error) {
return
}
//解码mapjson到对象
func (this *Codec) UnmarshalMapString(data []byte, v interface{}) error {
return nil
}
///日志*********************************************************************** ///日志***********************************************************************
func (this *codec) Debug() bool { func (this *Codec) Debug() bool {
return this.options.Debug return this.options.Debug
} }
func (this *codec) Debugf(format string, a ...interface{}) { func (this *Codec) Debugf(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Debugf("[SYS Gin] "+format, a...) this.options.Log.Debugf("[SYS Codec] "+format, a...)
} }
} }
func (this *codec) Infof(format string, a ...interface{}) { func (this *Codec) Infof(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Infof("[SYS Gin] "+format, a...) this.options.Log.Infof("[SYS Codec] "+format, a...)
} }
} }
func (this *codec) Warnf(format string, a ...interface{}) { func (this *Codec) Warnf(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Warnf("[SYS Gin] "+format, a...) this.options.Log.Warnf("[SYS Codec] "+format, a...)
} }
} }
func (this *codec) Errorf(format string, a ...interface{}) { func (this *Codec) Errorf(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Errorf("[SYS Gin] "+format, a...) this.options.Log.Errorf("[SYS Codec] "+format, a...)
} }
} }
func (this *codec) Panicf(format string, a ...interface{}) { func (this *Codec) Panicf(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Panicf("[SYS Gin] "+format, a...) this.options.Log.Panicf("[SYS Codec] "+format, a...)
} }
} }
func (this *codec) Fatalf(format string, a ...interface{}) { func (this *Codec) Fatalf(format string, a ...interface{}) {
if this.options.Debug { if this.options.Debug {
this.options.Log.Fatalf("[SYS Gin] "+format, a...) this.options.Log.Fatalf("[SYS Codec] "+format, a...)
} }
} }

View File

@ -106,6 +106,7 @@ type (
WriteFloat64(val float64) WriteFloat64(val float64)
WriteString(val string) WriteString(val string)
WriteBytes(val []byte) WriteBytes(val []byte)
Reset(bufSize int)
Buffer() []byte //返回缓存区数据 Buffer() []byte //返回缓存区数据
Error() error Error() error
SetErr(err error) SetErr(err error)

View File

@ -1,6 +1,7 @@
package factory package factory
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"reflect" "reflect"
@ -63,7 +64,7 @@ func encoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IEncoder {
}) })
} }
} }
return &structEncoder{typ, finalOrderedFields} return &structEncoder{ctx.ICodec, typ, finalOrderedFields}
} }
func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder { func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder {
@ -97,7 +98,7 @@ func decoderOfStruct(ctx *core.Ctx, typ reflect2.Type) core.IDecoder {
} }
} }
} }
return createStructDecoder(ctx.Options(), typ, fields) return createStructDecoder(ctx.ICodec, typ, fields)
} }
//结构第编辑码构建 //结构第编辑码构建
@ -205,11 +206,11 @@ func calcFieldNames(originalFieldName string, tagProvidedFieldName string, whole
return fieldNames return fieldNames
} }
func createStructDecoder(opt *core.Options, typ reflect2.Type, fields map[string]*structFieldDecoder) core.IDecoder { func createStructDecoder(codec core.ICodec, typ reflect2.Type, fields map[string]*structFieldDecoder) core.IDecoder {
if opt.DisallowUnknownFields { if codec.Options().DisallowUnknownFields {
return &structDecoder{typ: typ, fields: fields, disallowUnknownFields: true} return &structDecoder{typ: typ, fields: fields, disallowUnknownFields: true}
} else { } else {
return &structDecoder{opt, typ, fields, false} return &structDecoder{codec, typ, fields, false}
} }
} }
@ -244,6 +245,7 @@ func resolveConflictBinding(opt *core.Options, old, new *Binding) (ignoreOld, ig
//结构对象 编解码----------------------------------------------------------------------------------------------------------------------- //结构对象 编解码-----------------------------------------------------------------------------------------------------------------------
type structEncoder struct { type structEncoder struct {
codec core.ICodec
typ reflect2.Type typ reflect2.Type
fields []structFieldTo fields []structFieldTo
} }
@ -271,12 +273,33 @@ func (this *structEncoder) Encode(ptr unsafe.Pointer, stream core.IStream) {
} }
} }
func (this *structEncoder) EncodeToMapString(ptr unsafe.Pointer) (ret map[string]string, err error) {
ret = make(map[string]string)
stream := this.codec.BorrowStream()
for _, field := range this.fields {
if field.encoder.omitempty && field.encoder.IsEmpty(ptr) {
continue
}
if field.encoder.IsEmbeddedPtrNil(ptr) {
continue
}
stream.Reset(512)
field.encoder.Encode(ptr, stream)
if stream.Error() != nil && stream.Error() != io.EOF {
err = stream.Error()
return
}
ret[field.toName] = BytesToString(stream.Buffer())
}
return
}
func (this *structEncoder) IsEmpty(ptr unsafe.Pointer) bool { func (this *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {
return false return false
} }
type structDecoder struct { type structDecoder struct {
opt *core.Options codec core.ICodec
typ reflect2.Type typ reflect2.Type
fields map[string]*structFieldDecoder fields map[string]*structFieldDecoder
disallowUnknownFields bool disallowUnknownFields bool
@ -302,7 +325,7 @@ func (this *structDecoder) decodeField(ptr unsafe.Pointer, extra core.IExtractor
field = extra.ReadString() field = extra.ReadString()
fieldDecoder = this.fields[field] fieldDecoder = this.fields[field]
if fieldDecoder == nil && !this.opt.CaseSensitive { if fieldDecoder == nil && !this.codec.Options().CaseSensitive {
fieldDecoder = this.fields[strings.ToLower(field)] fieldDecoder = this.fields[strings.ToLower(field)]
} }
@ -324,6 +347,32 @@ func (this *structDecoder) decodeField(ptr unsafe.Pointer, extra core.IExtractor
fieldDecoder.Decode(ptr, extra) fieldDecoder.Decode(ptr, extra)
} }
//解码对象从MapJson 中
func (this *structDecoder) DecodeForMapString(ptr unsafe.Pointer, extra map[string]string) (err error) {
var fieldDecoder *structFieldDecoder
ext := this.codec.BorrowExtractor([]byte{})
for k, v := range extra {
fieldDecoder = this.fields[k]
if fieldDecoder == nil && !this.codec.Options().CaseSensitive {
fieldDecoder = this.fields[strings.ToLower(k)]
}
if fieldDecoder == nil {
if this.disallowUnknownFields {
err = errors.New("found unknown field: " + k)
return
}
continue
}
ext.ResetBytes(StringToBytes(v))
fieldDecoder.Decode(ptr, ext)
if ext.Error() != nil && ext.Error() != io.EOF {
err = ext.Error()
return
}
}
return
}
//结构对象字段 编解码----------------------------------------------------------------------------------------------------------------------- //结构对象字段 编解码-----------------------------------------------------------------------------------------------------------------------
type structFieldTo struct { type structFieldTo struct {
encoder *structFieldEncoder encoder *structFieldEncoder

View File

@ -146,6 +146,12 @@ func (this *JsonStream) WriteString(val string) {
func (this *JsonStream) WriteBytes(val []byte) { func (this *JsonStream) WriteBytes(val []byte) {
this.buf = append(this.buf, val...) this.buf = append(this.buf, val...)
} }
func (this *JsonStream) Reset(bufSize int) {
this.buf = make([]byte, 0, bufSize)
this.err = nil
this.indention = 0
return
}
func (this *JsonStream) Buffer() []byte { func (this *JsonStream) Buffer() []byte {
return this.buf return this.buf
} }