一起谈.NET技术,如何将XML与OBJECT进行相互转换(泛型以及通用方法)

  对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错。它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成。比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),现在看一年前的代码,哥感叹,这个谁写的代码,TMD实在写的太烂了!!!当然,ORMCodeHelper与CodeSmith相比,还是有差距的哦。霖哥以前给我的codesmith模板(N层的),哥一直没时间仔细看,哥知道那个模板可以把所有的代码全部生成,其中包括N层代码、存储过程、页面等等。虽然时间就像乳沟,只要挤一挤总还是有的!但是,哥真的......本来9号哥都是请假休息的,唉,又要哥上班了....

还有就是对于MVC3,Razor实在太给力了,扔掉MVC2吧,哈哈,@确实挺不错的。

  在ORMCodeHelper中,对于配置文件的使用的思路还是不错的,哥学以致用,提炼个泛型的出来(其实最主要的还是插件开发的架构)。对于XML与OBJECT的转换来说,下面讲的是一种Serialize方法。其实哥还有另外一种通过反射将XML转换成对象的方法,不过,涉及到公司****,那种方法还是不写了。当然,那种方法哥是可以横着写了(因为哥早就背在心里了),哈哈,通用的代码....

  先看代码,如下:

    public static class Serializer
    {

        public static void Serialize<T>(string filePath, T[] array)  where T:new()
        {
            if (string.IsNullOrEmpty(filePath)||
                array == null||array.Length==0)
            {
                return;
            }

            try
            {
                XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
                XmlSerializer xmlSerializer =
                    xmlSerializerFactory.CreateSerializer(array.GetType(), typeof(T).Name);
                Stream stream = new FileStream(filePath, FileMode.Create);
                xmlSerializer.Serialize(stream, array);
                stream.Close();
            }
            catch
            {
            }
        }

        public static void Serialize(string filePath, object obj)
        {
            if (string.IsNullOrEmpty(filePath) || obj == null)
            {
                return;
            }

            try
            {
                XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
                XmlSerializer xmlSerializer =
                    xmlSerializerFactory.CreateSerializer(obj.GetType(), obj.GetType().Name);
                Stream stream = new FileStream(filePath, FileMode.Create);
                xmlSerializer.Serialize(stream, obj);
                stream.Close();
            }
            catch
            {
            }
        }

    }

        public static List<T> Deserialize<T>(string filePath)  where T:new()
        {
            List<T> results=new List<T>();
            if (string.IsNullOrEmpty(filePath)||!File.Exists(filePath))
            {
                return results;
            }

            object obj = null;
            try
            {
                XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
                XmlSerializer xmlSerializer =
                    xmlSerializerFactory.CreateSerializer(typeof(T[]), typeof(T).Name);
                Stream stream = new FileStream(filePath, System.IO.FileMode.Open);
                obj = xmlSerializer.Deserialize(stream);
                stream.Close();

                results.AddRange(obj as T[]);
            }
            catch
            {
            }
           
            return results;
        }

        public static object Deserialize(string filePath, Type targetType)
        {
            if (string.IsNullOrEmpty(filePath)||!File.Exists(filePath)
                || targetType == null)
            {
                return null;
            }

            object obj = null;
            try
            {
                XmlSerializerFactory xmlSerializerFactory = new XmlSerializerFactory();
                XmlSerializer xmlSerializer =
                    xmlSerializerFactory.CreateSerializer(targetType, targetType.Name);
                Stream stream = new FileStream(filePath, FileMode.Open);
                obj = xmlSerializer.Deserialize(stream);
                stream.Close();
            }
            catch
            {
            }

            return obj;
        }

  从上面4个方法,可以看出主要是通过XmlSerializer将对象序列化为XML以及将XML反序列化为对象,这种方法比较简单,而且易用。

  (一)Serialize<T>(string filePath, T[] array),Deserialize<T>(string filePath)

  通过单元测试来看看Serialize<T>(string filePath, T[] array)方法生成的XML内容,先注释掉//DeleteFile(filePath);

public void SerializeTestHelper(AppSetting[] inputs)
        {
            AppSetting[] settings = inputs;
            string filePath = @"d:\" + typeof(AppSetting).Name + ".config";

            Serializer.Serialize<AppSetting>(filePath, settings);
            List<AppSetting> results = Serializer.Deserialize<AppSetting>(filePath);

            int length = results.Count;
            Assert.IsTrue(length == settings.Length);

            for (int index = 0; index < length; index++)
            {
                Assert.IsTrue(results[index].Value == settings[index].Value);
                Assert.IsTrue(results[index].Key == settings[index].Key);
                Assert.IsTrue(results[index].Author == settings[index].Author);
            }

            //DeleteFile(filePath);
        }

  生成的XML如下:

<?xml version="1.0"?>
<ArrayOfAppSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AppSetting">
  <AppSetting>
    <Key>key0</Key>
    <Value>value0</Value>
    <Author>author0</Author>
  </AppSetting>
  <AppSetting>
    <Key>key1</Key>
    <Value>value1</Value>
    <Author>author1</Author>
  </AppSetting>
  <AppSetting>
    <Key>key2</Key>
    <Value>value2</Value>
    <Author>author2</Author>
  </AppSetting>
</ArrayOfAppSetting>

  从上面的单元测试可以看出:通过Serialize<T>(string filePath, T[] array)方法将对象数组生成XML内容,可以通过Deserialize<T>(string filePath)将XML内容转换成相应的对象数组,内容相一致。

  (二)Serialize(string filePath, object obj),Deserialize(string filePath, Type targetType)
  通过单元测试来看看Serialize(string filePath, object obj)方法生成的XML内容,先注释掉//DeleteFile(filePath);

private static void SerializeTestHelper()
        {
            AppSetting setting = new AppSetting()
            {
                Author = "AuthorTest",
                Key = "KeyTest",
                Value = "ValueTest"
            };
            string filePath = @"d:\" + typeof(AppSetting).Name + ".config";

            Serializer.Serialize(filePath, setting);
            AppSetting result = Serializer.Deserialize(filePath, typeof(AppSetting)) as AppSetting;

            Assert.IsTrue(result.Value == setting.Value);
            Assert.IsTrue(result.Author == setting.Author);
            Assert.IsTrue(result.Key == setting.Key);

            //DeleteFile(filePath);
        }

  生成的XML如下:

<?xml version="1.0"?>
<AppSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AppSetting">
  <Key>KeyTest</Key>
  <Value>ValueTest</Value>
  <Author>AuthorTest</Author>
</AppSetting>

  从上面的单元测试可以看出:通过Serialize(string filePath, object obj)方法将对象生成XML内容,可以通过Deserialize(string filePath, Type targetType)将XML内容转换成相应的对象,内容相一致。其中,object也可以是对象数组的,这个留给读者自己去验证。

  测试都是可以通过的,这里仅仅是验证正确的功能,如下图:

时间: 2024-07-30 09:58:23

一起谈.NET技术,如何将XML与OBJECT进行相互转换(泛型以及通用方法)的相关文章

使用泛型以及通用方法将XML与OBJECT进行相互转换

过年的这段时间一直没有闲着,总体来说可以分为以下2个部分的学习. 1:ORMCodeHelper的参考 与学习. 2:MVC3的学习. 对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用 ,个人感觉还是比较爽的,架构不错.它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码 的生成.比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的 (http://www.cnblogs.com/jasenkin/archive/20

如何将XML与OBJECT进行相互转换(泛型以及通用方法)

对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错.它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成.比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),现在看一年前的代码,哥感叹,这个谁写的代码,TMD实在写的太烂了!!!当然,ORMCodeHel

如何将XML与O“.NET研究”BJECT进行相互转换(泛型以及通用方法)

对于ORMCodeHelper(Keny的),完全的采用插件式开发,即插即用,个人感觉还是比较爽的,架构不错.它包括了SQL SERVER 2000,SQL SERVER 2005以及ORACLE的相关C#代码的生成.比哥一年前写的那个牛多了,哈哈,哥去年乱写了个网页版的(http://www.cnblogs.com/jasenkin/archive/2010/02/11/1667511.html),现在看一年前的代码,哥感叹,这个谁写的代码,TMD实在写的太烂了!!!当然,ORMCodeHel

一起谈.NET技术,提高ASP.NET应用程序性能的十大方法

一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果你是用动态的SQL语句来返回多个数据集,那我建议你用存储过程来替代动态的SQL语句.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不用在过滤数据,

一起谈.NET技术,ASP.NET MVC中对数据进行排序的方法

本系列是讲解如何在asp.net mvc中对数据进行展示.排序.分页等的系列文章.在上周的文章中,一步一步教会了大家如何使用ASP.NET MVC框架去的展示数据.在上周的文章中,我们先用Visual Studio创建了一个新的ASP.NET MVC应用程序,接着连接到了Northwind数据库,并展示了如何使用微软的LINQ-SQL的工具去访问数据库中的数据,接着指导如何去实现视图层去展示产品信息及如何设计控制器. 本文是在上一篇文章的例子基础上,展示了如何去实现数据的双向排序.如果你是已经熟

一起谈.NET技术,在ASP.NET 2.0中数据绑定的实现方法

1.为什么ASP.NET 2.0中的数据绑定控件不需要写代码就能完成更新.删除.新建等数据操作? ASP.NET 1.x时,DataGrid等控件使用DataBinder.Eval(Container.DataItem,"ColumnName")这样的表达式可以将数据源中的数据绑定到控件上,但并不能在更新数据时自动将控件中的新值取出,更新回数据库.所以ASP.NET 2.0中的数据绑定分为两种:单向数据绑定(即表达式或ReadOnly设为True的BoundField,只提供从数据源到

一起谈.NET技术,C#资源释放及Dispose、Close和析构方法

在开始本文前,需要一些准备知识.首先要提出"什么是资源".在CLR出来之后,Windows系统资源开始分为"非托管资源"和"托管资源".非托管资源是指:所有的Window内核对象(句柄)都是非托管资源,如对于Stream,数据库连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到CLR管理:托管资源是指:由CLR管理分配和释放的资源,即由CLR里new出来的对象. 其次再来讲,资源的释放方式.非托管资源:需要显式释放的,也即需要你写代

一起谈.NET技术,浅谈如何使用.NET存储XML数据

XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射:OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有了OpenXML的关系视图,你就能使用T-SQL代码查询XML文档中的数据并把结果存储在你的SQL Server数据库中. 这三种技术中的每一种都是为特定的目的设计的.XML Bulk Load把来自很大的XML文档的数据存储在SQL Server中:Updategrams执行SQL Server数

一起谈.NET技术,XML和实体序列化和反序列化

近来的项目中用到了序列化就抽空学习了一下,拿出来给大家分享一下: 类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容: 公共类的公共读写字段或者属性 XmlElement对象 XmlNode对象 Dataset对象 实现了Icollection 或IEnumerable的类 该类在设计中有一个设计需求: 需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常 在开发过程中可能会有很多地方要用到对象和XML相互转化,