大家都使用过.NET的序列化机制。只要给类型标上 [Serializable] 特性,即可将任何数据对象转化为二进制数据形式,以方便保存或传输。并且使用起来非常方便。下面是一个最简单的例子:
//写数据
using ( FileStream writer = new FileStream( fileName, FileMode.Create ) )
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize( writer, data );
}
//读数据
using ( FileStream reader = new FileStream( fileName, FileMode.Open ) )
{
IFormatter formatter = new BinaryFormatter();
return formatter.Deserialize( reader ) as T;
}
用序列化机制,就不需要用户去考虑特定的数据结构,提供了一般化的数据保存方式,此功能非常强大。由于自己不满足仅仅会使用,于是就想能否自己也实现个类似的功能呢?
——于是就有了下面的XmlSave类,这个类将用户自定义的类型以XML格式保存到文件中并可以从文件中恢复对象。
先看其使用方法(下面的Student类型是自定义类型的代表,其属性不具有实际意义):
class Student
{
[Save( "" )]
public string Name { get; set; }
[Save( "" )]
public List<int> Number { get; set; }
}
……
//写入
XmlSave x = new XmlSave( "d:\\a.txt" );
Student s = new Student();
s.Name = "xbc";
s.Number = new List<int>();
s.Number.Add( 0 );
s.Number.Add( 1 );
x.Wirte(s);
//读取
XmlSave x = new XmlSave( "d:\\a.txt" );
Student t = x.Read() as Student;
XmlSave类使用.NET的反射机制,自动解析出类型的结构,并保存到XML文件中。
上面这个例子生成的XML文件如下:Student类型中的属性有个Save()特性,这是个自定义的特性,只所以需要这个类型是因为可以让用户决定该保存类型的哪些属性,只有加上这个标志的属性才会被保存到文件中。
<?xml version="1.0" standalone="yes"?>
<root Type="XBC.Student" Name="xbc">
<Number IsList="True">
<Item>0</Item>
<Item>1</Item>
</Number>
</root>
现阶段,XmlSave可以保存的类型可分为四种:
一、"int",即.NET内置的简单类型,如:System.Boolean,Byte,SByte,Char,Decimal,Double,Int32,String,Enum,Guid……
int
<?xml version="1.0" standalone="yes"?><root Type="System.Int32"> <Item>4</Item></root>
二、"List<int>"简单类型的List<T>泛型集合
List
<?xml version="1.0" standalone="yes"?>
<root IsList="True" Type="System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]">
<Item>1</Item>
<Item>3</Item>
<Item>5</Item>
</root>
三、"Student"自定义类型
Student
<?xml version="1.0" standalone="yes"?>
<root Type="XBC.Student" Name="xbc" Age="23" />
四、"List<Student>"自定义类型的泛型List<T>类型
List