C#序列化和反序列化
系列化是将对象写入流的过程,而反序列化是从流中读取对象的过程。在类上使用[Serializable]属性标注为可序列化,用[NoSerializable]标注某变量不可被序列化。
有时候在程序中徐希望将一个变量序列化,却希望在反序列化的时候可以得到这个对象进行的操作,而得到没有被序列化的变量,这是可以通过执行Ideserialization CallBack接口来实现。该接口只包含了一个方法:
void OnDeserialization(Object sender)
一个简单的例子如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication1
{
[Serializable]
class Add : IDeserializationCallback
{
private int num1;
private int num2;
[NonSerialized]
private int sum;
public Add() { }
public Add(int num1, int num2)
{
this.num1 = num1;
this.num2 = num2;
}
public int Apply()
{
sum = num1 + num2;
return sum;
}
public int Result
{
get {
return sum;
}
}
public void OnDeserialization(Object sender)
{
sum = num1 + num2;
}
}
class Program
{
static void Main(string[] args)
{
Add add = new Add(1,2);
add.Apply();
FileStream fs = new FileStream("c:\\c-sharp.txt",FileMode.OpenOrCreate);
BinaryFormatter binFormatter = new BinaryFormatter();
Console.WriteLine("object serializable ...");
binFormatter.Serialize(fs, add);
fs.Position = 0;
Console.WriteLine("deserializable ...");
Add sum = (Add)binFormatter.Deserialize(fs);
Console.WriteLine("Add.sum=" + sum.Result);
//sum.Apply();
Console.WriteLine("1+2="+sum.Result);
}
}
}