如何将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> De
serialize<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-31 03:23:33

如何将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

一起谈.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实在写的太烂了!!!当然,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

php中实现xml与mysql数据相互转换的方法_php技巧

本文实例讲述了php中实现xml与mysql数据相互转换的方法.分享给大家供大家参考.具体分析如下: 这里提供了一个mysql2xml转换类,可以快速的把xml转换成mysql同时反之也可以把mysql转换成xml,下面看代码. mysql2xml.php类文件,用于备份MySQL数据的,代码如下: 复制代码 代码如下: <?php class MySQL2XML {         protected $conn;         protected $result;         prot

通过Java泛型实现数组排序和搜索的通用方法

下面讨论的是数组的排序和搜索功能,而一个通用方法则是实现Comparable接口的方法,这个方法需要通过java泛型来实现.下面便逐步讲解为何,以及如何通过Java泛型实现此类的通用方法. 如何在java类中一些通用方法,特别是一些静态的工具方法? 比如,数组Arrays的sort.search等? 1. 整数数组的顺序收缩 public static int seqSearch(int[] arr, int first, int last, int target) { for (int i =

java泛型问题,方法参数问题

问题描述 java泛型问题,方法参数问题 Java泛型. 代码如下: class Info{ private T var; public void setVar(T var){ this.var=var; } public T getVar(){ return this.var; } public String toString(){ return this.var.toString(); } } 下面是第一个测试程序: public class GenericsDemo6{ public st

某一目录下的所有 XML文件绑定到不同的DataGrid的方法

<!--某一目录下的所有 XML文件绑定到不同的DataGrid的方法.原著:孟子E章修改:塞北的雪--><%@ Page Language="vb"%><%@ Import NameSpace = "System" %><%@ Import NameSpace = "System.Xml" %><%@ Import NameSpace = "System.IO" %>

Java中的XML: 数据绑定,第 1 部分:代码生成方法 — JAXB 及其它

数据绑定 提供了一种简单而直接的方法,以在 Java 平台应用程序中使用 XML.有了数据绑定,应用程序可以在很大程度上忽略 XML 文档的实际结构,而 直接使用那些文档的数据内容.虽然这种方法不能适合于所有应用程序,但在一 般情况下,对于那些将 XML 用于数据交换的应用程序是比较理想的. 除了简化编程之外,数据绑定还提供了其它一些好处.由于数据绑定对许多文 档细节进行了抽象,因此对于在内存中处理文档,它通常所需要的内存比文档模 型方法(譬如 DOM 或 JDOM)要少.您还会发现,由于不需要

jQuery解析XML文件同时动态增加js文件的方法

  本文实例讲述了jQuery解析XML文件同时动态增加js文件的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $(function(){ $.ajax({ url: 'js/config/jsConfig.xml', dataType: 'xml', success: function(data){ $(data).find("moduleName").each(function(i,obj)