主要参考资料:

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. SQL中inner join,outer join和cross join的区别

    使用join连表,缺陷的情况下是inner join,开发中使用的left join和right join属于outer join,outer join还包括full join 现有两张表,Table ...

  2. (转)Vue2.X的路由管理记录之 钩子函数(切割流水线)

    $route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,里面的属性是 immutable(不可变) 的,不过你可以 watch(监测变化)它. 导航和钩子函数: 导航:路由正在发生改 ...

  3. IOS 开发学习33 使用sqlite3

    sqlite3 命令行简单使用 sqlite3 路径 //打开数据库路径连接 select * from sqlite_master where type="table"; //显 ...

  4. virtualbox使用相关问题

    官方下载地址: http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html VirtualBox主 ...

  5. java泛型介绍

    一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...

  6. ionic中ionicView的生命周期

    ionicView的生命周期的事件调用在每个ionicView的controller中使用$scope.$on('$ionicView.enter', function() {});调用. 1.$ i ...

  7. org.eclipse.e4.core.di.InjectionException:org.eclipse.swt.SWTException: Widget is disposed

    org.eclipse.e4.core.di.InjectionException:org.eclipse.swt.SWTException: Widget is disposed 开发环境为ecli ...

  8. WebDriver API——第1部分

    The API definitions in this chapter shows the absolute location of classes. However the recommended ...

  9. STL源码剖析(容器适配器)

    在STL中,有一类容器完全以底部容器为基础进行实现,这类容器归类为container adapter. priority_queue priority_queue默认使用vector为基础,加上hea ...

  10. [C/C++]关于C++11中的std::move和std::forward

    http://www.cnblogs.com/cbscan/archive/2012/01/10/2318482.html http://blog.csdn.net/fcryuuhou/article ...