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序列化類的實現方式。
文章列表