zoukankan      html  css  js  c++  java
  • C#对象与XMl文件之间的相互转换

    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<Team> 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<Person> 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<Team>();
              dep.Teams.Add(newTeam("Test","测试团队"));
              dep.Teams.Add(newTeam("Develop","开发团队"));
              dep["Test"].Persons =new List<Person>();
              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文件的格式为:

    代码如下:

    <?xml version="1.0"encoding="utf-8"?>
    <Department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Name>事业部</Name>
      <Teams>
        <Team>
          <Name>Test</Name>
          <Title>测试团队</Title>
          <Persons>
            <Person>
              <Name>dwf</Name>
              <Age>22</Age>
              <Hobby>程序</Hobby>
              <Station>测试工程师</Station>
            </Person>
            <Person>
              <Name>WL</Name>
              <Age>22</Age>
              <Hobby>代码</Hobby>
              <Station>测试工程师</Station>
            </Person>
          </Persons>
        </Team>
        <Team>
          <Name>Develop</Name>
          <Title>开发团队</Title>
          <Persons>
            <Person>
              <Name>dwf22</Name>
              <Age>22</Age>
              <Hobby>程序</Hobby>
              <Station>开发工程师</Station>
            </Person>
            <Person>
              <Name>WL33</Name>
              <Age>22</Age>
              <Hobby>代码</Hobby>
              <Station>高级开发工程师</Station>
            </Person>
          </Persons>
        </Team>
      </Teams>
    </Department> 


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

    修改后的代码为:

    代码如下:

    public class Department
        {
            public Department()
            { 
            }
            [XmlAttribute]
            public string Name;
            public List<Team> 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 version="1.0" encoding="utf-8"?>
    <Department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="事业部">
      <Teams>
        <Team Name="Test" Title="测试团队">
          <Persons>
            <Person Name="dwf" Age="22" Hobby="程序" Station="测试工程师" />
            <Person Name="WL" Age="22" Hobby="代码" Station="测试工程师" />
          </Persons>
        </Team>
        <Team Name="Develop" Title="开发团队">
          <Persons>
            <Person Name="dwf22" Age="22" Hobby="程序" Station="开发工程师" />
            <Person Name="WL33" Age="22" Hobby="代码" Station="高级开发工程师" />
          </Persons>
        </Team>
      </Teams>
    </Department>


    通过以上方式便实现了将对应的对象转换为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序列化类的实现方式。

    对象的三者的代码为:

    复制代码代码如下:

    public class Department
        {
            public Department()
            { 
            }
            public string Name;
            public List<Team> 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<Person> 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<Team>();
              dep.Teams.Add(newTeam("Test","测试团队"));
              dep.Teams.Add(newTeam("Develop","开发团队"));
              dep["Test"].Persons =new List<Person>();
              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文件的格式为:

    代码如下:

    <?xml version="1.0"encoding="utf-8"?>
    <Department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Name>事业部</Name>
      <Teams>
        <Team>
          <Name>Test</Name>
          <Title>测试团队</Title>
          <Persons>
            <Person>
              <Name>dwf</Name>
              <Age>22</Age>
              <Hobby>程序</Hobby>
              <Station>测试工程师</Station>
            </Person>
            <Person>
              <Name>WL</Name>
              <Age>22</Age>
              <Hobby>代码</Hobby>
              <Station>测试工程师</Station>
            </Person>
          </Persons>
        </Team>
        <Team>
          <Name>Develop</Name>
          <Title>开发团队</Title>
          <Persons>
            <Person>
              <Name>dwf22</Name>
              <Age>22</Age>
              <Hobby>程序</Hobby>
              <Station>开发工程师</Station>
            </Person>
            <Person>
              <Name>WL33</Name>
              <Age>22</Age>
              <Hobby>代码</Hobby>
              <Station>高级开发工程师</Station>
            </Person>
          </Persons>
        </Team>
      </Teams>
    </Department> 


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

    修改后的代码为:

    代码如下:

    public class Department
        {
            public Department()
            { 
            }
            [XmlAttribute]
            public string Name;
            public List<Team> 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 version="1.0" encoding="utf-8"?>
    <Department xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="事业部">
      <Teams>
        <Team Name="Test" Title="测试团队">
          <Persons>
            <Person Name="dwf" Age="22" Hobby="程序" Station="测试工程师" />
            <Person Name="WL" Age="22" Hobby="代码" Station="测试工程师" />
          </Persons>
        </Team>
        <Team Name="Develop" Title="开发团队">
          <Persons>
            <Person Name="dwf22" Age="22" Hobby="程序" Station="开发工程师" />
            <Person Name="WL33" Age="22" Hobby="代码" Station="高级开发工程师" />
          </Persons>
        </Team>
      </Teams>
    </Department>


    通过以上方式便实现了将对应的对象转换为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序列化类的实现方式。

  • 相关阅读:
    python制作一个塔防射箭游戏
    有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同 学号的那些结点。
    python实现一个简单的21点游戏
    C语音,函数padd的功能是调整pa指向的链表中结点的位置,使得所有x值为偶数的结点出现在链表的前半部,所有x值为奇数的结点出现在链表的后半部。
    scratch绘制特殊图形1
    验证哥德巴赫猜想,输出6-100之间的偶数等于两个质数之和
    写一函数check检测字符串中的左右括号数是否匹配
    C语言文件操作题,将整数1-10及其算术平方根存入文件,再读取出来显示在屏幕上
    湖南2020对口计算机32题第1、2、3小题
    基础
  • 原文地址:https://www.cnblogs.com/zuowj/p/3455104.html
Copyright © 2011-2022 走看看