• 遵循Spring大纲的XML(反)序列化 SpringFox --ESBasic 可复用的.NET类库(27)


    (题外话:前面连续N篇介绍都是一些应用比较复杂的类,这篇来个简单易懂的)

    1.缘起:

         .NET Framework提供的Soap序列化的方式可以实现对象的xml序列化和反序列化(object <=> xml ,但是它有三个缺点:

    (1)     它要求对象的类型定义时必须打上[Serializable]标签,这是强侵入性的。

    (2)     .NETSoap序列化与程序集的版本紧密关联,如果对象的类型定义没有发生变化,而仅仅是定义该类型的程序集版本发生了变化,那么反序列化(xml=>object)就可能失败。

    (3)     采用.NET自带的Soap序列化得到的xml中带有太多对我们应用来说无关紧要的信息,这使得xml结果的个头很大。 

         ESBasic.Persistence.SpringFox类提供了更加灵活的 object <-> xml 自动化实现。SpringFox 用于将object xml字符串相互转换,且XML大纲遵循Spring.netobject配置大纲。

     

    2.适用场合:

    (1)     需要将一个对象xml后进行保存或传输,并在以后需要时,能依据xml还原这个对象。

    (2)     目标对象的类型定义相对简单,比如,没有循环引用,没有复杂的集合类型。

    (3)     可以用于应用程序的配置信息的保存与读取。

    (4)     可以自动生成对象的spring配置文本。

    3.设计思想与实现

          SpringFox的类图如下所示:

      

        其主要提供了两个静态方法,XmlObject方法用于将对象转换为xml字符串以完成序列化的过程,而ObjectXml方法则用于将xml字符串还原为对象以完成反序列化。SpringFox主要使用了反射技术和xml技术,相对简单,关于其实现细节可直接参考源码。

        有一点要注意的是NonXmlAttribute这个特性,定义这个特性的目的与.NET自带的NonSerializable特性的目的是一样的,如果某个对象的某个Property不希望被SpringFox进行xml序列化,则可以为该Property打上NonXmlAttribute标签。

    4. 使用时的注意事项

    (1)     SpringFox将转换object的类型的所有没有被NonXmlAttribute修饰的属性。前提是,目标属性必须是可读的(getter)。

    (2)     当前版本仅支持IList<>/ List<>集合类型,转换时将忽略其它集合和数组类型的属性。

    (3)     可以转换内嵌的自定义简单类型,但不支持循环对象引用。

     

    5.扩展

     SpringFox一个非常有用的场合就是应用程序的配置文件(xml)与配置object之间的相互转换,有了SpringFox,我们不需要在手动打造解析和生成配置文件了。

     ESBasic.Persistence.AgileConfiguration类借助SpringFox封装好了这些功能,你的配置object的类型只要从AgileConfiguration继承,就可以自动拥有与XML之间同步信息的功能。

        public abstract class AgileConfiguration
        {
            
    /// <summary>
            
    /// Load 将XML配置文件中的内容转换为Object
            
    /// </summary>        
            public static AgileConfiguration Load(string configFilePath)
            {
                XmlDocument doc 
    = new XmlDocument();
                doc.Load(configFilePath);

                
    return (AgileConfiguration)SpringFox.ObjectXml(doc.ChildNodes[0].OuterXml);
            }

            
    /// <summary>
            
    /// Save 将当前配置保存到目标xml文件
            
    /// </summary>   
            public void Save(string configFilePath)
            {
                
    string xml = SpringFox.XmlObject(this);
                FileHelper.GenerateFile(configFilePath, xml);
            }
        }

    AgileConfiguration.Load静态方法将读取目标XML配置文件的内容,并返回对应的配置Object,返回类型为AgileConfiguration,你可以向下强转为你自己的配置类型;Save方法将当前的配置object保存到目标xml文件。

     比如我们应用程序的配置object的类型定义如下: 

        public class AppConfiguration AgileConfiguration
        {
            
    #region Port
            
    private int port = 6600;
            
    public int Port
            {
                
    get { return port; }
                
    set { port = value; }
            } 
            
    #endregion

            
    #region ServerName
            
    private string serverName = "";
            
    public string ServerName
            {
                
    get { return serverName; }
                
    set { serverName = value; }
            } 
            
    #endregion

            
    #region Url
            
    private string url;
            
    public string Url
            {
                
    get { return url; }
                
    set { url = value; }
            } 
            
    #endregion
        }

     转换该类型的某个配置对象到xml文件后,文件的内容如下所示:

    <object type="XmlFoxTest.AppConfiguration,XmlFoxTest">
      
    <property name="Port" value="6600" />
      
    <property name="ServerName" value="AppliactionSystem" />
      
    <property name="Url" value="http://www.springframework.net/" />
    </object>

     最后提一下,如果能再结合PropertyGrid控件,将配置的对象绑定到PropertyGrid,就可以很方便的实现图形化的配置管理了。

     

     

    注: ESBasic已经开源,点击这里下载源码。
        
    ESBasic开源前言

     

     

  • 相关阅读:
    taro 填坑之路(一)taro 项目回顾
    Redux遵循的三个原则是什么?
    解释一下 Flux
    MVC框架的主要问题是什么?
    与 ES5 相比,React 的 ES6 语法有何不同?
    你了解 Virtual DOM 吗?解释一下它的工作原理
    DOM 事件有哪些阶段?谈谈对事件代理的理解
    CSS:用Less实现栅格系统
    .NET:国际化和本地化
    自定义工作流 之 模型设计与实现
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1901839.html
Copyright © 2020-2023  润新知