C#对象和XMl文件之间的转换

  上一篇文章中,主要对自己实现XMl文件和对应的对象之间的转换的实现方案以及对应的程序的结构做了一个简短的描述和介绍,其中那片文章主要是对博主无待的关于通用配置文件的实现的一些理解和心得。后来,查看博主文章的评论时,有读者提到了可以采用序列化的方式实现两者之间的对应关系的转换,虽然自己以前也就序列化有一些了解,当没有真正的使用过。不过,想想通用配置文件的实现的目标也就是实现对应的对象的永久保存和通过对应的保存的永久文件的信息解析出对应的对象的过程,因此,便对序列化的知识进行了一些学习,并基于序列化实现了对应的对象了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(new Team("Test", "测试团队"));
            dep.Teams.Add(new Team("Develop", "开发团队"));
            dep["Test"].Persons = new List<Person>();
            dep["Test"].Persons.Add(new Person("dwf", 22, "程序", "测试工程师"));
            dep["Test"].Persons.Add(new Person("WL", 22, "代码", "测试工程师"));
            dep["Develop"].Persons.Add(new Person("dwf", 22, "程序", "开发工程师"));
            dep["Develop"].Persons.Add(new Person("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序列化类的实现方式。



 

 

posted @ 2012-01-17 22:17  寻梦者1988  阅读(3774)  评论(1编辑  收藏  举报