天天看點

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 Title;

        public List<Person> Persons;

 public  class Person

        public Person()

        public Person(string Name,int Age,string Hobby,string Station)

            this.Age = Age;

            this.Hobby = Hobby;

            this.Station = Station;

        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>

          <Name>WL</Name>

          <Hobby>代碼</Hobby>

      </Persons>

    </Team>

      <Name>Develop</Name>

      <Title>開發團隊</Title>

          <Name>dwf22</Name>

          <Station>開發工程師</Station>

          <Name>WL33</Name>

          <Station>進階開發工程師</Station>

  </Teams>

</Department> 

通過以上方式生成的Xml檔案也儲存了對應對象的屬性以及對應的包含的成員的資訊,但是XMl檔案裡面對于對象的所有屬性都是通過添加對應的子節點進行展示的,當通常我們對應XMl檔案的組織,當對應的成員為對應對象的屬性資訊時我們更多的是希望對應的屬性資訊節點來設定對應的屬性資訊。為此,開始查找對應的序列化操作的時候是否提供了對應的設定方法來修改對應的節點資訊為屬性資訊,通過查找,發現可以通過對對應的屬性節點,添加自定義屬性,設定對應的對象屬性儲存為XMl檔案時的格式以及對應的XMl節點的名稱。

修改後的代碼為:

        [XmlAttribute]

以上隻是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="事業部">

    <Team Name="Test" Title="測試團隊">

        <Person Name="dwf" Age="22" Hobby="程式" Station="測試工程師" />

        <Person Name="WL" Age="22" Hobby="代碼" Station="測試工程師" />

    <Team Name="Develop" Title="開發團隊">

        <Person Name="dwf22" Age="22" Hobby="程式" Station="開發工程師" />

        <Person Name="WL33" Age="22" Hobby="代碼" Station="進階開發工程師" />

</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序列化類的實作方式。

複制代碼代碼如下:

本文轉自 夢在旅途 部落格園部落格,原文連結: http://www.cnblogs.com/zuowj/p/3455104.html ,如需轉載請自行聯系原作者