C# 中使用 XmlSerializer 实现类和xml文件的序列化和反序列化,使用起来非常简单。

C# XmlSerializer实现序列化:

XmlSerializer xml = new XmlSerializer(typeof(ClassName));

FileStream fs = new FileStream(@"d:\t.xml",FileMode.Create);

xml.Serialize(fs, new Class());

fs.Close();

C# XmlSerializer实现反序列化

FileStream fs = new FileStream(@"d:\t.xml", FileMode.Open);

XmlSerializer xml = new XmlSerializer(typeof(ClassName));

ClassName t = (ClassName)xml.Deserialize(fs);

C# XmlSerializer类与主流的序列化类的几个不同点是:

1、不需要Serializable属性,使用XmlIgnore属性标记不需要序列化的属性。

2、该类不能安全地访问私有变成员,所以学要将私有成员改为公共成员,或者提供合适的公共特性。

3、要求被序列化的类要有一个默认的构造器。

下面上个实例,直接上代码:

1、需要序列化的类

[XmlRoot("Person")]
public class Person
{
  [XmlElement("name")]
  public string Name { get; set; }

  [XmlAttribute("sex")]
  public byte Sex { get; set; }

  [XmlAttribute("age")]
  public int Age { get; set; }

  [XmlText]
  public string Description { get; set; }

  [XmlElement("child")]
  public List<Person> Childrens { get; set; }

  [XmlElement("childlist")]
  public ChildList ChildList { get; set; }
}

请注意红色标注的属性,生成的xml文件是不一样的^_^

[XmlRoot("Childs")]
public class ChildList
{
  [XmlElement("person")]
  public List<Person> Childs { get; set; }
}

2、声明对象

Person person = new Person { Name="张三", Sex=1, Age=25, Description="我是一名中国人!!" };
person.Childrens = new List<Person>();
person.Childrens.Add(new Person { Name="Boy", Sex=1, Age=5, Description="我是男孩" });
person.Childrens.Add(new Person { Name="Girl", Sex=0, Age=10, Description="我是女孩" });

person.ChildList = new ChildList();
person.ChildList.Childs = new List<Person>();
person.ChildList.Childs.Add(new Person { Name = "Jon", Sex = 1, Age = 5 });
person.ChildList.Childs.Add(new Person { Name = "KG", Sex = 0, Age = 10 });

3、序列化

string path = System.AppDomain.CurrentDomain.BaseDirectory;
using (FileStream fs = new FileStream(path + "parson.xml", FileMode.Create))
{
  serializer.Serialize(fs, person);
  fs.Close();
}

4、反序列化

using (FileStream fs = new FileStream(path + "parson.xml", FileMode.Open))
{
  person = (Person)serializer.Deserialize(fs);
  fs.Close();
}

C# XmlSerializer序列化浅析的更多相关文章

  1. .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式

    BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...

  2. XmlSerializer序列化

    XmlSerializer在命名空间using System.Xml.Serialization下. 序列化和反序列化的代码: using System.IO; using System.Xml; u ...

  3. C# XmlSerializer实现序列化浅析

    C# XmlSerializer类是实现序列化的一个类,那么关于C# XmlSerializer的学习我们要掌握怎么样的操作方法呢?那么这里向你详细介绍具体的操作细节情况. C# XmlSeriali ...

  4. C#中XmlSerializer实现序列化浅析

    C# XmlSerializer类是实现序列化的一个类,那么关于C# XmlSerializer的学习我们要掌握怎么样的操作方法呢?那么这里向你详细介绍具体的操作细节情况. C# XmlSeriali ...

  5. 使用XmlSerializer序列化可空属性

    使用XmlSerializer可以方便的将对象序列化为xml,实现应用之间的数据交互.但是XmlSerializer却不能很好地序列化类型中的可空字段. 例如,有如下定义的类Person: [Seri ...

  6. 学习C# XmlSerializer 序列化反序列化XML

    类.变量常用头: [XmlRootAttribute]:对根节点的描述,在类声明中使用 如:下例的Html类 [XmlType]:对节点描述,在类声明中使用         如:下例的Head类 [X ...

  7. C#调用XmlSerializer序列化时生成CDATA节点解决方法

    public class Person{    public string Name { get; set; }    public int Age { get; set; }        } 引用 ...

  8. C# 派生类的XmlSerializer序列化XML

    近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...

  9. JAVA序列化浅析

    java.io.Serializable浅析 Java API中java.io.Serializable接口源码: 1 public interface Serializable { 2 } 类通过实 ...

随机推荐

  1. 有关mysql数据库的编码

    今天在通过表单给php提交数据,然后插入到数据库中.网页与php的编码格式均为utf-8,在插入到数据库中时也设置了$this->query("set names utf8;" ...

  2. iOS中定时器NSTimer的使用-备用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  3. Top 100 words for advanced learners.

    aberration (n.) something that differs from the norm (In 1974, Poland won the World Cup, but the suc ...

  4. MySQL 学习笔记 (它执行的步骤)

    基本步骤是 : (不是很准,请看完这篇) 1.from 2.join on 3.where 4.group by 5.having 6.order by 7.select 8.distinct ,su ...

  5. 玩转Google开源C++单元测试框架Google Test系列(转载)

    越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...

  6. css属性之@media

    Base Browsers: IE6.0+, Firefox2.0+, Chrome4.0+, Safari6.0+, Opera15.0+ <expression>:指定媒体查询使用的媒 ...

  7. 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...

  8. BIND9源码学习笔记1---gdb调试篇

    学习bind9源码之前,首先要知道如何用gdb来调试bind.BIND9的源码我是先看代码弄懂它的架构,像什么event-drive,epoll等, 再去看它的业务流程.看业务流程的时候要追踪它的数据 ...

  9. 运营总监招聘-e袋洗招聘-拉勾网

    运营总监招聘-e袋洗招聘-拉勾网 运营总监

  10. 抓取“矢量”的实时交通流量数据

    1. 引言 最近老师有一个需求,就是想要抓取实时的矢量交通流量数据来做分析,类似于百度地图,高德地图的"实时路况"那种.平时的网络抓取工作一般是抓取网页上现成的数据,但是交通流量数 ...