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

简介: (题外话:前面连续N篇介绍都是一些应用比较复杂的类,这篇来个简单易懂的) 1.缘起:      .NET Framework提供的Soap序列化的方式可以实现对象的xml序列化和反序列化(object xml) ,但是它有三个缺点: (1)     它要求对象的类型定义时必须打上[Serializable]标签,这是强侵入性的。

(题外话:前面连续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开源前言

 

 

 

 

目录
相关文章
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
268 1
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
697 12
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
234 14
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
419 3
|
开发框架 .NET Linux
2款高效的.NET二维码生成类库
2款高效的.NET二维码生成类库
328 1
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
579 3
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
251 0
|
XML 开发框架 数据格式
.Net Core 开发框架,支持多版本的类库
.Net Core 开发框架,支持多版本的类库
410 0
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
360 0