本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
XmlSerializerNamespaces ns =
new
XmlSerializerNamespaces();
ns.Add(
"
my
"
,
"
http://flibble
"
);
Workers workers
=
new
Workers();
workers.MyWorkers
=
new
Worker[] {
new
Worker() { Name =
"
1
"
, Number =
1
},
new
Worker() { Name =
"
2
"
, Number =
2
} };
XmlSerializer mySerializer
=
new
XmlSerializer(
typeof
(Workers));
StreamWriter myWriter
=
new
StreamWriter(
"
myFileName.xml
"
);
mySerializer.Serialize(myWriter, workers, ns);
myWriter.Close();
workers
=
null
;
FileStream myFileStream1
=
new
FileStream(
"
myFileName.xml
"
, FileMode.Open);
workers
=
(Workers)mySerializer.Deserialize(myFileStream1);
int
iii =
0
;
catch
(System.Exception ex)
int
iiii =
0
;
private
Worker[] m_workers =
null
;
#endregion
[XmlElement(Namespace
=
"
http://flibble
"
, ElementName =
"
Worker
"
)]
public
Worker[] MyWorkers
get
{
return
m_workers; }
set
{ m_workers =
value; }
public
class
Worker
#region
private data.
private
int
m_number =
0
;
private
string
m_name =
null
;
#endregion
[XmlElement(Namespace
=
"
http://flibble
"
, DataType =
"
int
"
)]
public
int
Number
get
;
set
;
//
get { return m_number; }
//
set { m_number = value; }
[XmlAttribute(
"
Name
"
, Namespace =
""
)]
public
string
Name
get
{
return
m_name; }
set
{ m_name =
value; }
-----------------------------------------------------------------------------------------
static void Main(string[] args)
using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>"))
//声明序列化对象实例serializer
XmlSerializer serializer = new XmlSerializer(typeof(int));
//反序列化,并将反序列化结果值赋给变量i
int i = (int)serializer.Deserialize(rdr);
//输出反序列化结果
Console.WriteLine("i = " + i);
Console.Read();
以上代码用最简单的方式说明了xml序列化和反序列化的过程,.Net系统类库为我们做了大量的工作,序列化和反序列化都非常简单。但是在现实中业务需求往往比较复杂,不可能只简单的序列化一个int变量,显示中我们需要对复杂类型进行可控制的序列化。
自定义对象的Xml序列化:
System.Xml.Serialization命名空间中有一系列的特性类,用来控制复杂类型序列化的控制。例如 XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、 XmlArrayItemAttribute、XmlRootAttribute等等。
看一个小例子,有一个自定义类Cat,Cat类有三个属性分别为Color,Saying,Speed。
namespace UseXmlSerialization
class Program
static void Main(string[] args)
//声明一个猫咪对象
var c = new Cat { Color = "White", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" };
//序列化这个对象
XmlSerializer serializer = new XmlSerializer(typeof(Cat));
//将对象序列化输出到控制台
serializer.Serialize(Console.Out, c);
Console.Read();
[XmlRoot("cat")]
public class Cat
//定义Color属性的序列化为cat节点的属性
[XmlAttribute("color")]
public string Color { get; set; }
//要求不序列化Speed属性
[XmlIgnore]
public int Speed { get; set; }
//设置Saying属性序列化为Xml子元素
[XmlElement("saying")]
public string Saying { get; set; }
可以使用XmlElement指定属性序列化为子节点(默认情况会序列化为子节点);或者使用XmlAttribute特性制定属性序列化为Xml节点的属性;还可以通过XmlIgnore特性修饰要求序列化程序不序列化修饰属性。
对象数组的Xml序列化:
数组的Xml序列化需要使用XmlArrayAttribute和XmlArrayItemAttribute;XmlArrayAttribute指定数组元素的Xml节点名,XmlArrayItemAttribute指定数组元素的Xml节点名。
如下代码示例:
/*玉开技术博客 http://www.cnblogs.com/yukaizhao */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace UseXmlSerialization
class Program
static void Main(string[] args)
//声明一个猫咪对象
var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" };
var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black, so long as the cat can catch mice, it is a good cat" };
CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };
//序列化这个对象
XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));
//将对象序列化输出到控制台
serializer.Serialize(Console.Out, cc);
Console.Read();
[XmlRoot("cats")]
public class CatCollection
[XmlArray("items"),XmlArrayItem("item")]
public Cat[] Cats { get; set; }
[XmlRoot("cat")]
public class Cat
//定义Color属性的序列化为cat节点的属性
[XmlAttribute("color")]
public string Color { get; set; }
//要求不序列化Speed属性
[XmlIgnore]
public int Speed { get; set; }
//设置Saying属性序列化为Xml子元素
[XmlElement("saying")]
public string Saying { get; set; }
以上代码将输出:
<?xml version="1.0" encoding="gb2312"?>
<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema">
<items>
<item color="White">
<saying>White or black, so long as the cat can catch mice, it is a good
cat</saying>
</item>
<item color="Black">
<saying>White or black, so long as the cat can catch mice, it is a good
cat</saying>
</item>
</items>
</cats>
XmlSerializer内存泄漏问题:
多谢chenlulouis,仔细看了下msdn,确实存在泄漏的情况,msdn说明如下:
动态生成的程序集
为了提高性能,XML 序列化基础结构将动态生成程序集,以序列化和反序列化指定类型。此基础结构将查找并重复使用这些程序集。此行为仅在使用以下构造函数时发生:
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
如果使用任何其他构造函数,则会生成同一程序集的多个版本,且绝不会被卸载,这将导致内存泄漏和性能降低。最简单的解决方案是使用先前提到的两个构造函数的其中一个。否则,必须在 Hashtable 中缓存程序集,如以下示例中所示。
也就是说我们在使用XmlSerializer序列化,初始化XmlSerializer对象时最好使用下面两个构造函数否则会引起内存泄漏。
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
C#处理Xml的相关随笔:
通过XmlDocument读写Xml文档
使用XmlReader读Xml,
使用XmlWriter写Xml
使用Linq to xml存取XML
通过XmlScheme定义固定格式xml文档
Xml序列化或者反序列化类
通过XPath查找Xml节点
通过Xslt转化Xml格式