主要参考资料:

http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1

 
XML序列化是把强类型的类转化为XML,用于存储和传输。
特征:
1)只会序列化public的属性和字段
2)不包含类型信息
3)构造函数不能有参数
4)ReadOnly的属性是不会被序列化的
 
1. 通用静态类
在这里我用了一个public的static方法来处理序列化和反序列化:
    public static class ExtXMLSerialization
{
public static void SerializeToXml<T>(T obj, string fileName)
{
XmlSerializer ser = new XmlSerializer( typeof(T));
FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate);
ser.Serialize(fileStream, obj);
fileStream.Close();
} public static T DeserializeFromXml<T>(string xml)
{
T result;
XmlSerializer ser = new XmlSerializer( typeof(T));
using (TextReader tr = new StringReader(xml))
{
result = (T)ser.Deserialize(tr);
}
return result;
}
}
之后的函数就调用这个方法来写范例代码了。
 
2. 基本方法
首先先要添加引用:
using System.Xml.Serialization;
using System.IO;
然后来看一个最简单的范例:
    class Program
{
static void Main(string[] args)
{
Class1 a = new Class1();
a.Property1 = ;
a.Property2 = "aaa";
ExtXMLSerialization.SerializeToXml<Class1 >(a, "C:\\1.xml"); Console.Read();
}
} public class Class1
{
public int Property1
{
get;
set;
} public string Property2
{
get;
set;
}
}
最终会生成这么个xml:
<?xml version="1.0"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Property1>1</Property1>
  <Property2>aaa</Property2>
</Class1>
 
2. List
对于Generic的List,需要增加一个XmlElement
我们来增加一个类:
    public class Class1List
{
[ XmlElement("Class1" )]
public List <Class1> MyList
{
get;
set;
} public Class1List()
{
MyList = new List <Class1>();
}
}
然后序列化这个类:
         static void Main(string[] args)
{
Class1 a = new Class1();
a.Property1 = ;
a.Property2 = "aaa";
Class1 b = new Class1();
b.Property1 = ;
b.Property2 = "bbb";
Class1List list = new Class1List();
list.MyList.Add(a);
list.MyList.Add(b);
ExtXMLSerialization.SerializeToXml<Class1List >(list, "C:\\1.xml"); Console.Read();
}
由于Class1List这个类通过Class1这个子类的tag来解析,需要我们用XmlElement关键字来指引。
结果如下:
<?xml version="1.0"?>
<Class1List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Class1>
    <Property1>1</Property1>
    <Property2>aaa</Property2>
  </Class1>
  <Class1>
    <Property1>2</Property1>
    <Property2>bbb</Property2>
  </Class1>
</Class1List>
除了XmlElement之外,还有XmlAttribute(表示Attribute),XmlIgnore(表忽视),XmlRoot(表根节点)
 
我现在工作项目中用到的基本都是JSON。。。
不过自己随便写写东西还是会用XML,毕竟可读性好一些。之前自己脑残竟然全部用XDocument手工来读写。。。于是最近重构了。
 
补充:
1. static的成员不会被序列化
 
2. 与Java Serializer之间的互相移植
 
3. 不能对interface类型
例如IModel
不然就会得到错误:
Cannot serialize member XXXX of type YYY because it is an interface.
 
4. 如果要对private的对象序列化,用DataContractSerializer
 
5. 如果要反序列化诸如:
<Class1>
     <Model>1</Model>
     <Model>2</Model>
</Class1>
这样的XML,可以用List<string>
public class Class1
{
[XmlElement("Model")]
public List<string> Model;
}
 
6. 性能
可以参考这篇
相比之下,用binary的DataContractSerializer性能最好
 
掌握了这些差不多就可以开始用了。如果用的时候还发现什么,再补充吧。

XML序列化和反序列化(C#)的更多相关文章

  1. XML 序列化与反序列化

    XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...

  2. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

  3. C#的XML序列化及反序列化

    webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...

  4. .NET XML序列化与反序列化

    闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...

  5. XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.   为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...

  6. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...

  7. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...

  8. Windows phone 之XML序列化与反序列化

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  9. C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

  10. C#实现接口xml序列化与反序列化

    C#实现接口xml序列化与反序列化   C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...

随机推荐

  1. transparent shadow caster unity

    https://forum.unity.com/threads/semitransparent-shadows.276490/ semitransparent shadows dither 类似alp ...

  2. Eclipse代码布局怎么使用退格和缩进快捷键?

    Eclipse代码布局怎么使用退格和缩进快捷键? 好的程序,不仅要运行快速准确,而且还要易于理解.研究表明,清晰的代码布局可以提高程序猿的理解能力.何为代码布局?其实就是代码的缩进.留白等.为了保证清 ...

  3. Solr 中 Schema 结构说明

    schema.xml位于solr/conf/目录下,类似于数据表配置文件,定义了加入索引的数据的数据类型,主要包括type.fields和其他的一些缺省设置 1.schema的基本配置 <?xm ...

  4. android适配的努力

    1. 优测 http://utest.qq.com/ 2. 云测 3. 阿里云移动 4. 百度移动测试.

  5. 扩展JButton实现自己的图片按钮

    实现效果: 代码: import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.In ...

  6. qs.stringify() 和JSON.stringify()的区别

    var a = {name:'hehe',age:10}; qs.stringify(a) // 'name=hehe&age=10' JSON.stringify(a) // '{" ...

  7. Oracle DMP 操作笔记之根据DMP逆向推导出导出的表空间名称

    最近在带着一群.NET新兵们在开发和升级一套系统,本人虽然工作好几年,但是也是属于啥都懂一点,啥都不会的队伍,碰到新兵更是蛋都碎了,还特别拘谨,为啥新兵们都是基础知识很不错的,看来要好好练习内功了,好 ...

  8. 【leetcode】Reorder List (python)

    问题的思路是这样: 循环取头部合并,事实上也能够换个角度来看,就是将后面的链表结点,一次隔空插入到第一部分的链表中. class Solution: # @param head, a ListNode ...

  9. Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)

    静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强. 在java中动态代理由InvocationHander来实现. He ...

  10. 一个架构合理的UITableView应该是如何的?

    原文: http://www.chentoo.com/?p=200 iOS 开发中,UITableView 应该是最经常使用到的了.完毕一个UITableView应该实现他的DataSource和De ...