C# 序列化(Serialize)与反序列化(Deserialize)

   序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

 .NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

1.BinaryFormatter 

命名空间:System.Runtime.Serialization.Formatters.Binary;
下面先定义一个可序列化类:

[Serializable] // 表示该类可被序列化
class Peoson
{
public Peoson() { }
public Peoson( string name, int age)
{
this .name = name;
this .age = age;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
[NonSerialized]
// 表示下面这个age字段不进行序列化
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public void SayHi()
{
Console.WriteLine(
" 大家好,我是{0},今年{1}岁 " ,name,age);
}
}

Main函数中:

List < Peoson > listPers = new List < Peoson > ();
Peoson per1
= new Peoson( " 张三 " , 18 );
Peoson per2
= new Peoson( " 李四 " , 20 );
listPers.Add(per1);
listPers.Add(per2);
SerializeMethod(listPers);
// ReserializeMethod(); // 反序列化成把上面一行注释掉 执行此行
Console.ReadKey();

序列化和反序列化的方法:

static void ReserializeMethod()
{
// 反序列化
using (FileStream fs = new FileStream( " 1.bin " , FileMode.Open))
{
BinaryFormatter bf
= new BinaryFormatter();
List
< Peoson > list = bf.Deserialize(fs) as List < Peoson > ;
if (list != null )
{

for ( int i = 0 ; i < list.Count; i ++ )
{
list[i].SayHi();
}
}

}
}

static void SerializeMethod(List < Peoson > listPers)
{
// 序列化
using (FileStream fs = new FileStream( " 1.bin " , FileMode.Create))
{
BinaryFormatter bf
= new BinaryFormatter();
bf.Serialize(fs, listPers);
}
}
}

反序列化输出结果:

大家好,我是张三,今年0岁

大家好,我是李四,今年0岁

由此看出,未序列化的字段存储的值为空。

2、使用XmlSerializer进行串行化
    关于格式化器还有一个问题,假设我们需要XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。
    如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:
    a.添加System.Xml.Serialization命名空间。
    b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。
    c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。
序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
 List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

转载于:https://www.cnblogs.com/agile2011/archive/2011/06/12/2078959.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值