C#对象与XMl文件之间的相互转换
C#提供三种序列化方式,分别为:
1、是使用BinaryFormatter进行串行化;
2、使用SoapFormatter进行串行化;
3、使用XmlSerializer进行串行化。其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以直接序列化。在这里面我们主要采用XMlSerialize来实现对应的序列化操作进而实现对应的对象和XMl文件之间的转换关系。
在通过序列化实现对应的转换关系操作的功能时,我首先创建了Department ,teams,Person三个对象,并设置了对应对象之间的关系,建立的三个对象以及他们之间的对应关系模型如下图所示:
对象的三者的代码为:
{
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文件的转换,对应的实现转换的代码为:
{
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文件的格式为:
<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 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文件为:
<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文件转换为对应的对象。实现的代码为:
FileStream stream = new FileStream (filePath,FileMode.Open );
Department dep=(Department)serializer.Deserialize(stream);
stream.Close();
这样便通过XMl序列化的方式实现了对应的对象和Xml文件之间的转换关系,而且对应的对象的属性和转换后的XMl文件中的节点的名称之间的对应关系是可以进行设置的。这样第一篇中介绍的同样Xml文件的配置工具的实现,相当于是实现了对应的Xml序列化的功能,从使用的过程中可以发现,第一篇文章中介绍的实现就是对应的Xml序列化类的实现方式。
对象的三者的代码为:
{
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文件的转换,对应的实现转换的代码为:
{
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文件的格式为:
<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 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文件为:
<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文件转换为对应的对象。实现的代码为:
FileStream stream = new FileStream (filePath,FileMode.Open );
Department dep=(Department)serializer.Deserialize(stream);
stream.Close();
这样便通过XMl序列化的方式实现了对应的对象和Xml文件之间的转换关系,而且对应的对象的属性和转换后的XMl文件中的节点的名称之间的对应关系是可以进行设置的。这样第一篇中介绍的同样Xml文件的配置工具的实现,相当于是实现了对应的Xml序列化的功能,从使用的过程中可以发现,第一篇文章中介绍的实现就是对应的Xml序列化类的实现方式。
C#对象与XMl文件之间的相互转换的更多相关文章
- C#对象与XMl文件之间的相互转换(转)
本文是对C#中对象与XMl文件之间的相互转换进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使 ...
- JAXB—Java类与XML文件之间转换
JAXB-Java类与XML文件之间转换 简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...
- C#.Net 持久化对象为XML文件
</pre><pre code_snippet_id="613717" snippet_file_name="blog_20150307_1_57950 ...
- 使用XPath对象解析xml文件
使用XPath对象解析xml文件 1.DocumentBuilderFactory类 工厂API,使应用程序能从XML文档获取生成DOM对象树的解析器 其构造方法受保护,用newInstance() ...
- JS中实现JSON对象和JSON字符串之间的相互转换
对于主流的浏览器(比如:firefox,chrome,opera,safari,ie8+),浏览器自己提供了JSON对象,其中的parse和stringify方法实现了JSON对象和JSON字符串之间 ...
- 对象和XML文件的转换
很多时候,我们开发程序都需要使用到对象的XML序列化和反序列化,对象的XML序列化和反序列化,既可以使用XML对象(XmlDocument)进行操作,也可以使用XmlSerializer进行操作,两个 ...
- js将xml对象,xml文件解析成xml dom对象,来对对象进行操作
由于ie与其他的浏览器对于xml文件的解析方式不同,所以有不同的解析方式 1.1 IE解析xml文件的方式 var xmlDoc=new ActiveXObject("Microsoft.X ...
- xml文件生成方式一(字符串拼接,将多实体类对象写入xml文件)
1.xml文件生成,拼接字符串使用StringBuffer或StringBuilder 2.拼接好后写入文件即可,将多个实体类写入xml文件 3.这种方式比较简单,但是操作也比较麻烦 4.下面是我的代 ...
- C# datatable 与 xml文件之间的转换
/// <summary> /// datatable转XML文件 /// </summary> /// <param name="dtTable"& ...
随机推荐
- SIFT 特征提取算法总结
原文链接:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html 主要步骤 1).尺度空间的生成: 2).检测尺度空间极 ...
- Lucene 4.X 倒排索引原理与实现: (2) 倒排表的格式设计
1. 定长编码 最容易想到的方式就是常用的普通二进制编码,每个数值占用的长度相同,都占用最大的数值所占用的位数,如图所示. 这里有一个文档ID列表,254,507,756,1007,如果按照二进制定长 ...
- Jmeter之JDBC Request使用方法(oracle)
JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Connection Configuration 配置元件一起配合使用. 目录: 一 ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- Aspose转PDF时乱码问题的解决
主要原因是服务器上一般安装的字体都是有限的,而我们日常生活工作中总是喜欢用一些比较特别的字体,比如宋体GB2312,这时候如果用Aspose转PDF就会出现乱码,解决方法也比较简单,把本地的特殊字体拷 ...
- 解决cxf+spring发布的webservice,types,portType和message以import方式导入
用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...
- dwz_bootstrap + thinkphp
http://www.thinkphp.cn/code/936.html 回去继续学习 SuperWebSocket
- Java IO--压缩流
压缩流: 压缩流的实现: zipEntry: 在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中的每一个元素的名称. ZipOutputStream: import java.io ...
- 使用U盘代替光盘来刻录ISO镜像文件的方法
原文链接: http://jingyan.baidu.com/article/d3b74d64aa4a6a1f77e60932.html 1.以管理员身份运行UltraISO,点击“文件”菜单下的“打 ...
- openssl - rsa加解密例程
原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加 ...