golang的xml反序列化工具,支持抽象接口反序列化

woilsx · · 1747 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

超实用工具,请收藏。 以前一直做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>

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1747 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传