// Package serialize ... // // Description : serialize ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2025-04-28 11:58 package serialize import ( "errors" "git.zhangdeman.cn/zhangdeman/serialize/abstract" "sync" ) var ( Wrapper = &wrapper{ serializableTable: map[string]abstract.Serializable{ "xml": Xml, "yml": Yml, "yaml": Yml, "toml": Toml, "ini": Ini, "json": JSON, }, l: &sync.RWMutex{}, } ) type wrapper struct { serializableTable map[string]abstract.Serializable l *sync.RWMutex } // GetSerializable ... func (w *wrapper) GetSerializable(t string) (abstract.Serializable, error) { w.l.RLock() if _, exist := w.serializableTable[t]; !exist { w.l.RUnlock() return nil, errors.New(t + ": is not support") } serializable := w.serializableTable[t] w.l.RUnlock() if nil == serializable { return nil, errors.New("serializable is nil") } return serializable, nil } // SetSerializable 设置序列化实现, 已存在会覆盖 func (w *wrapper) SetSerializable(t string, serializable abstract.Serializable) { if nil == serializable { return } w.l.Lock() defer w.l.Unlock() w.serializableTable[t] = serializable } // Marshal 序列化 func (w *wrapper) Marshal(marshalType string, input any) ([]byte, error) { serializable, err := w.GetSerializable(marshalType) if nil != err { return nil, err } return serializable.MarshalForByte(input) } // Unmarshal 反序列化 func (w *wrapper) Unmarshal(unmarshalType string, input []byte, receiver any) error { serializable, err := w.GetSerializable(unmarshalType) if nil != err { return err } return serializable.UnmarshalWithNumber(input, receiver) }