C#對(duì)象與XMl文件之間的相互轉(zhuǎn)換
C#提供三種序列化方式,分別為:
1、是使用BinaryFormatter進(jìn)行串行化;
2、使用SoapFormatter進(jìn)行串行化;
3、使用XmlSerializer進(jìn)行串行化。其中對(duì)于BinaryFormatter的方式需要實(shí)現(xiàn)ISerializable接口,而XmlSeriializ不需要實(shí)現(xiàn)對(duì)應(yīng)的接口,可以直接序列化。在這里面我們主要采用XMlSerialize來實(shí)現(xiàn)對(duì)應(yīng)的序列化操作進(jìn)而實(shí)現(xiàn)對(duì)應(yīng)的對(duì)象和XMl文件之間的轉(zhuǎn)換關(guān)系。
在通過序列化實(shí)現(xiàn)對(duì)應(yīng)的轉(zhuǎn)換關(guān)系操作的功能時(shí),我首先創(chuàng)建了Department ,teams,Person三個(gè)對(duì)象,并設(shè)置了對(duì)應(yīng)對(duì)象之間的關(guān)系,建立的三個(gè)對(duì)象以及他們之間的對(duì)應(yīng)關(guān)系模型如下圖所示:
對(duì)象的三者的代碼為:
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;
}
基于以上三者的對(duì)應(yīng)關(guān)系,編寫對(duì)應(yīng)的調(diào)用函數(shù),實(shí)現(xiàn)對(duì)應(yīng)的對(duì)象和XMl文件的轉(zhuǎn)換,對(duì)應(yīng)的實(shí)現(xiàn)轉(zhuǎn)換的代碼為:
public static void Main()
{
Department dep =new Department();
dep.Name ="事業(yè)部";
dep.Teams =new List<Team>();
dep.Teams.Add(newTeam("Test","測(cè)試團(tuán)隊(duì)"));
dep.Teams.Add(newTeam("Develop","開發(fā)團(tuán)隊(duì)"));
dep["Test"].Persons =new List<Person>();
dep["Test"].Persons.Add(newPerson("dwf", 22,"程序", "測(cè)試工程師"));
dep["Test"].Persons.Add(newPerson("WL", 22,"代碼", "測(cè)試工程師"));
dep["Develop"].Persons.Add(newPerson("dwf", 22,"程序", "開發(fā)工程師"));
dep["Develop"].Persons.Add(newPerson("WL", 22,"代碼", "高級(jí)開發(fā)工程師"));
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>事業(yè)部</Name>
<Teams>
<Team>
<Name>Test</Name>
<Title>測(cè)試團(tuán)隊(duì)</Title>
<Persons>
<Person>
<Name>dwf</Name>
<Age>22</Age>
<Hobby>程序</Hobby>
<Station>測(cè)試工程師</Station>
</Person>
<Person>
<Name>WL</Name>
<Age>22</Age>
<Hobby>代碼</Hobby>
<Station>測(cè)試工程師</Station>
</Person>
</Persons>
</Team>
<Team>
<Name>Develop</Name>
<Title>開發(fā)團(tuán)隊(duì)</Title>
<Persons>
<Person>
<Name>dwf22</Name>
<Age>22</Age>
<Hobby>程序</Hobby>
<Station>開發(fā)工程師</Station>
</Person>
<Person>
<Name>WL33</Name>
<Age>22</Age>
<Hobby>代碼</Hobby>
<Station>高級(jí)開發(fā)工程師</Station>
</Person>
</Persons>
</Team>
</Teams>
</Department>
通過以上方式生成的Xml文件也保存了對(duì)應(yīng)對(duì)象的屬性以及對(duì)應(yīng)的包含的成員的信息,但是XMl文件里面對(duì)于對(duì)象的所有屬性都是通過添加對(duì)應(yīng)的子節(jié)點(diǎn)進(jìn)行展示的,當(dāng)通常我們對(duì)應(yīng)XMl文件的組織,當(dāng)對(duì)應(yīng)的成員為對(duì)應(yīng)對(duì)象的屬性信息時(shí)我們更多的是希望對(duì)應(yīng)的屬性信息節(jié)點(diǎn)來設(shè)置對(duì)應(yīng)的屬性信息。為此,開始查找對(duì)應(yīng)的序列化操作的時(shí)候是否提供了對(duì)應(yīng)的設(shè)置方法來修改對(duì)應(yīng)的節(jié)點(diǎn)信息為屬性信息,通過查找,發(fā)現(xiàn)可以通過對(duì)對(duì)應(yīng)的屬性節(jié)點(diǎn),添加自定義屬性,設(shè)置對(duì)應(yīng)的對(duì)象屬性保存為XMl文件時(shí)的格式以及對(duì)應(yīng)的XMl節(jié)點(diǎn)的名稱。
修改后的代碼為:
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修改后的對(duì)應(yīng)代碼,同樣對(duì)于Teams和Person的代碼也可以采用相同的方式對(duì)對(duì)象的屬性進(jìn)行修改,其中對(duì)應(yīng)的轉(zhuǎn)換后屬性的設(shè)置,不僅可以設(shè)置對(duì)應(yīng)的轉(zhuǎn)換后節(jié)點(diǎn)的類型還可以設(shè)置對(duì)應(yīng)轉(zhuǎn)換后的節(jié)點(diǎn)的名稱和對(duì)應(yīng)的屬性的名稱不相同,具體的設(shè)置可操作幫助文檔。
對(duì)應(yīng)的轉(zhuǎn)換后的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="事業(yè)部">
<Teams>
<Team Name="Test" Title="測(cè)試團(tuán)隊(duì)">
<Persons>
<Person Name="dwf" Age="22" Hobby="程序" Station="測(cè)試工程師" />
<Person Name="WL" Age="22" Hobby="代碼" Station="測(cè)試工程師" />
</Persons>
</Team>
<Team Name="Develop" Title="開發(fā)團(tuán)隊(duì)">
<Persons>
<Person Name="dwf22" Age="22" Hobby="程序" Station="開發(fā)工程師" />
<Person Name="WL33" Age="22" Hobby="代碼" Station="高級(jí)開發(fā)工程師" />
</Persons>
</Team>
</Teams>
</Department>
通過以上方式便實(shí)現(xiàn)了將對(duì)應(yīng)的對(duì)象轉(zhuǎn)換為XMl文件的功能,同樣通過反序列化的方式,可以實(shí)現(xiàn)將對(duì)應(yīng)的XMl文件轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象。實(shí)現(xiàn)的代碼為:
XmlSerializer serializer = new XmlSerializer(t);
FileStream stream = new FileStream (filePath,FileMode.Open );
Department dep=(Department)serializer.Deserialize(stream);
stream.Close();
這樣便通過XMl序列化的方式實(shí)現(xiàn)了對(duì)應(yīng)的對(duì)象和Xml文件之間的轉(zhuǎn)換關(guān)系,而且對(duì)應(yīng)的對(duì)象的屬性和轉(zhuǎn)換后的XMl文件中的節(jié)點(diǎn)的名稱之間的對(duì)應(yīng)關(guān)系是可以進(jìn)行設(shè)置的。這樣第一篇中介紹的同樣Xml文件的配置工具的實(shí)現(xiàn),相當(dāng)于是實(shí)現(xiàn)了對(duì)應(yīng)的Xml序列化的功能,從使用的過程中可以發(fā)現(xiàn),第一篇文章中介紹的實(shí)現(xiàn)就是對(duì)應(yīng)的Xml序列化類的實(shí)現(xiàn)方式。
- C#類中方法的執(zhí)行順序是什么
- C#類繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#類的多態(tài)性詳解
- C#類中static變量用法分析
- C#類的訪問修飾符用法分析
- c#類的使用示例
- C#類中的屬性使用總結(jié)(詳解類的屬性)
- C#類中屬性與成員變量的使用小結(jié)
- c#對(duì)象初始化順序?qū)嵗治?/a>
- C#對(duì)象為Null模式(Null Object Pattern)實(shí)例教程
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- 自定義實(shí)現(xiàn)Json字符串向C#對(duì)象轉(zhuǎn)變的方法
- 關(guān)于C# 類和對(duì)象詳情
相關(guān)文章
C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法
這篇文章主要介紹了C#定時(shí)器實(shí)現(xiàn)自動(dòng)執(zhí)行的方法,實(shí)例分析了C#定時(shí)器參數(shù)的設(shè)置及方法的調(diào)用與實(shí)現(xiàn),需要的朋友可以參考下2015-01-01C#使用GZipStream解壓縮數(shù)據(jù)文件的方法
這篇文章主要介紹了C#使用GZipStream解壓縮數(shù)據(jù)文件的方法,實(shí)例分析了C#中GZipStream方法的原理與使用技巧,需要的朋友可以參考下2015-04-04C#使?XmlReader和XmlWriter操作XML?件
這篇文章介紹了C#使?XmlReader和XmlWriter操作XML?件的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06