当前位置:  编程技术>.net/c#/asp.net

C#对象与XMl文件之间的相互转换

    来源: 互联网  发布时间:2014-10-24

    本文导语:  C#提供三种序列化方式,分别为:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用XmlSerializer进行串行化。其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以...

C#提供三种序列化方式,分别为:
1、是使用BinaryFormatter进行串行化;

2、使用SoapFormatter进行串行化;

3、使用XmlSerializer进行串行化。其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以直接序列化。在这里面我们主要采用XMlSerialize来实现对应的序列化操作进而实现对应的对象和XMl文件之间的转换关系。

在通过序列化实现对应的转换关系操作的功能时,我首先创建了Department ,teams,Person三个对象,并设置了对应对象之间的关系,建立的三个对象以及他们之间的对应关系模型如下图所示:

对象的三者的代码为:

代码如下:

public class Department
    {
        public Department()
        {
        }
        public string Name;
        public List Teams;
        public Team this[string Name]
        {
            get
            {
                Team t = null;
                foreach (Team te in Teams)
                {
                    if (string.Compare(te.Name, Name) == 0)
                    {
                        t = te;
                        break;
                    }
                }
                return t;
            }
        }
    }

  public  class Team
    {
        public Team()
        {

        }
        public Team(string Name,string Title)
        {
            this.Name = Name;
            this.Title = Title;
        }
        public string Name;
        public string Title;
        public List Persons;

    }

 public  class Person
    {
        public Person()
        {

        }
        public Person(string Name,int Age,string Hobby,string Station)
        {
            this.Name = Name;
            this.Age = Age;
            this.Hobby = Hobby;
            this.Station = Station;
        }
        public string Name;
        public int Age;
        public string Hobby;
        public string Station;
    }


基于以上三者的对应关系,编写对应的调用函数,实现对应的对象和XMl文件的转换,对应的实现转换的代码为:
代码如下:

public static void Main()
      {
          Department dep =new Department();
          dep.Name ="事业部";
          dep.Teams =new List();
          dep.Teams.Add(newTeam("Test","测试团队"));
          dep.Teams.Add(newTeam("Develop","开发团队"));
          dep["Test"].Persons =new List();
          dep["Test"].Persons.Add(newPerson("dwf", 22,"程序", "测试工程师"));
          dep["Test"].Persons.Add(newPerson("WL", 22,"代码", "测试工程师"));
          dep["Develop"].Persons.Add(newPerson("dwf", 22,"程序", "开发工程师"));
          dep["Develop"].Persons.Add(newPerson("WL", 22,"代码", "高级开发工程师"));

           XmlSerializer serializer =new XmlSerializer(dep.GetType());
          TextWriter writer =new StreamWriter("Department.xml");
          serializer.Serialize(writer, oSer);
          writer.Close();
      }

生成的XMl文件的格式为:
代码如下:



  事业部
 
   
      Test
      测试团队
     
       
          dwf
          22
          程序
          测试工程师
       
       
          WL
          22
          代码
          测试工程师
       
     
   
   
      Develop
      开发团队
     
       
          dwf22
          22
          程序
          开发工程师
       
       
          WL33
          22
          代码
          高级开发工程师
       
     
   
 


通过以上方式生成的Xml文件也保存了对应对象的属性以及对应的包含的成员的信息,但是XMl文件里面对于对象的所有属性都是通过添加对应的子节点进行展示的,当通常我们对应XMl文件的组织,当对应的成员为对应对象的属性信息时我们更多的是希望对应的属性信息节点来设置对应的属性信息。为此,开始查找对应的序列化操作的时候是否提供了对应的设置方法来修改对应的节点信息为属性信息,通过查找,发现可以通过对对应的属性节点,添加自定义属性,设置对应的对象属性保存为XMl文件时的格式以及对应的XMl节点的名称。

修改后的代码为:

代码如下:

public class Department
    {
        public Department()
        {
        }
        [XmlAttribute]
        public string Name;
        public List Teams;
        public Team this[string Name]
        {
            get
            {
                Team t = null;
                foreach (Team te in Teams)
                {
                    if (string.Compare(te.Name, Name) == 0)
                    {
                        t = te;
                        break;
                    }
                }
                return t;
            }
        }
    }

以上只是Department修改后的对应代码,同样对于Teams和Person的代码也可以采用相同的方式对对象的属性进行修改,其中对应的转换后属性的设置,不仅可以设置对应的转换后节点的类型还可以设置对应转换后的节点的名称和对应的属性的名称不相同,具体的设置可操作帮助文档。

对应的转换后的XMl文件为:

代码如下:



 
   
     
       
       
     
   
   
     
       
       
     
   
 


通过以上方式便实现了将对应的对象转换为XMl文件的功能,同样通过反序列化的方式,可以实现将对应的XMl文件转换为对应的对象。实现的代码为:
代码如下:

  XmlSerializer serializer = new XmlSerializer(t);
            FileStream  stream = new FileStream (filePath,FileMode.Open );
            Department  dep=(Department)serializer.Deserialize(stream);
            stream.Close();  

这样便通过XMl序列化的方式实现了对应的对象和Xml文件之间的转换关系,而且对应的对象的属性和转换后的XMl文件中的节点的名称之间的对应关系是可以进行设置的。这样第一篇中介绍的同样Xml文件的配置工具的实现,相当于是实现了对应的Xml序列化的功能,从使用的过程中可以发现,第一篇文章中介绍的实现就是对应的Xml序列化类的实现方式。

    
 
 

您可能感兴趣的文章:

  • c#对象中两种copy操作:深拷贝(Deep Copy)与浅拷贝(Shallow Copy)
  • C#托管堆对象实例包含内容分析
  • C#利用反射来判断对象是否包含某个属性的实现方法
  • C#中遍历DataSet数据集对象实例
  • c#泛型序列化对象为字节数组的示例
  • c#动态编译执行对象方法示例 运用映射机制创建对象
  • C#操作CLOB大对象的代码一例
  • C#对象为Null模式(Null Object Pattern)实例教程
  • c#创建Graphics对象的三种方法
  • C# DataTable 转换为 实体类对象实例
  • 使用c#面向对象实现对数据库的操作的代码
  • c# List find()方法返回值的问题说明(返回结果为对象的指针)
  • C#中Monitor对象与Lock关键字的区别分析
  • C#从实体对象集合中导出Excel的代码
  • 浅析C#中数组,ArrayList与List对象的区别
  • 自定义实现Json字符串向C#对象转变的方法
  • c#实现数据同步的方法(使用文件监控对象filesystemwatcher)
  • C#判等对象是否相等的方法汇总
  • C# 面向对象的基本原则
  • C#面向对象特征的具体实现及作用详解
  • C#基础之数组排序、对象大小比较实现代码
  • jquery对象和javascript对象即DOM对象相互转换
  • Java对象转换库 EZMorph
  • php数组与对象转换小例子
  • 如何从Vector中提取任意类型的对象(是否涉及强制类型转换)?
  • 时间字符串转换成日期对象datetime的方法
  • 请问有什么java共通类能在程序里将unicode转换成String对象?
  • java对象转换String类型的三种方法
  • jQuery.parseJSON(json)将JSON字符串转换成js对象
  • Java对象转换包 transmorph
  • JAVA对象JSON数据互相转换的四种常见情况
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python namedtuple对象json序列化/反序列化及对象恢复
  • 请问如何把StringBuffer 的对象转化成一个InputStream 的对象,或者InputStream 子类的对象也可以!
  • c++类对象数组初始化方式
  • 判断一个对象是否为jquery对象的方法
  • php中检测变量是否是一个对象的is_object函数介绍及用法举例
  • Glib对象系统(也称为"GObject")内部是如何实现面向对象特征的呢?
  • c++类对象初始化方式
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • java tomcat实现Session对象的持久化原理及配置方法介绍
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • 将ResultSet结果集中的记录映射到Map对象中
  • 请问:能不能动态的运行时生成对象(动态定义对象), 要涉及到哪些技术, 反射,序列化...??
  • php 5.5.14数据对象(PDO)介绍及PDO的预定义常量介绍
  • 重新编译PLSQL中的无效对象或者指定的对象 的方法
  • jquey笔记之dom对象与jquery对象互换的例子
  • 有人问我:何为面向对象编程?我给不出确切或形象的说法。谢!vb、pb等开发工具是不是面向对象编程的语言。
  • 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类?thinking in java里面的一个习题不知道如何做请教高手?
  • “当某个实例不再被任何对象引用时就会被垃圾回收机制回收”,那么怎样才算是不被任何对象引用呢?
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • 1. 请问linux下可以使用“typedef list<对象*> 对象列表名 ”和iterator吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3