超实用工具,请收藏。
以前一直做java云计算的开发,期间用到很多模板配置文件初始化驱动项目,特别是我们做到一定经验的人,对于配置化项目简直是刚需。
但是golang本身的反射能力太弱了,没有命名空间和根据字符串直接生成一个对象的能力,所以要反序列化一个抽象接口目前官方是不支持的。
![xmlInterface.png](https://static.studygolang.com/190816/b7383e1fe12ee41c2c890e7504b6f74f.png)
如上图,虽然官方的encoding/xml/read.go里面说在未来会支持Interface的接口反序列化,但是根据底层能力来说,也是必须要注入工厂才能实现,与其等官方这种经常拖延症的组织。
那我直接自己做了,原理其实不复杂,主要是要对golang的反射原理要非常熟悉,然后自己用操作dom一样的操作xml的节点工具就可以实现了。
直接上git链接:https://github.com/xukgo/xmlDeserializer
如果能帮到大家,希望多点小星星。
特点:
原理上兼容官方反序列化库encoding/xml
需要自己先把接口的实例工厂注册一下
支持自定义前缀标记
支持深度搜索前缀
支持深度递归反序列化
代码如下:
详细可以直接上git代码里面看,里面IEqualRuler,IParser都是抽象接口,反序列化过程自动实例化,无论是否是对象还是数组切片或者递归N层后的抽象接口
type RootModel struct {
XMLName xml.Name `xml:"Root"`
InstancePtrArray []*EqualRulerB `xml:"Rules>EqualRuleB"`
SingleInterface IEqualRuler `xml:"Factory.EqualRuler"`
InterfaceArray []IParser `xml:"Factory.Parser"`
InterfacePtrDeepChildren []IEqualRuler `xml:"EqualRulers>Factory.EqualRuler"`
}
var instanceMap map[string]map[string]interface{}
initXmlInstanceFactory()
defer disposeXmlInstanceFactory()
xmlDeserializer := xmlUtil.NewDeserializer("Factory", instanceMap)
instance := &RootModel{}
err := xmlDeserializer.Deserialize([]byte(testXml),instance)
if err != nil{
t.Fail()
}
xml来源:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Rules>
<EqualRuleB>
<Name>arr1</Name>
<Match>callin1</Match>
</EqualRuleB>
<EqualRuleB>
<Name>arr2</Name>
<Match>callin2</Match>
</EqualRuleB>
<EqualRuleB>
<Name>arr3</Name>
<Match>callin3</Match>
</EqualRuleB>
</Rules>
<EqualRuleA>
<Name>singleInstance</Name>
<Match>callin</Match>
</EqualRuleA>
<NotifyParser>
<Name>pppp</Name>
</NotifyParser>
<NotifyParser>
<Name>mmmm</Name>
</NotifyParser>
<CallParser>
<Index>111</Index>
</CallParser>
<CallParser>
<Index>222</Index>
</CallParser>
<EqualRulers>
<EqualRuleA>
<Name>sub1</Name>
<Match>a1</Match>
</EqualRuleA>
<EqualRuleB>
<Name>sub2</Name>
<Match>b2</Match>
</EqualRuleB>
<EqualRuleA>
<Name>sub3</Name>
<Match>a3</Match>
</EqualRuleA>
</EqualRulers>
</Root>
有疑问加站长微信联系(非本文作者)