现在的位置: 首页 > 综合 > 正文

模仿.NET的序列化机制

2012年04月28日 ⁄ 综合 ⁄ 共 1745字 ⁄ 字号 评论关闭

大家都使用过.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

抱歉!评论已关闭.