C# Form序列化

来源:互联网 发布:模拟炒汇软件下载 编辑:程序博客网 时间:2024/05/16 12:18

对什么序列化无关紧要,但是,如果将要被序列化的对象不支持序列化(即使指定了Serializable),那么这个对象一定要实现自定义序列化,还是拿Form来说吧,它是不支持序列化的,那么对它进行如下的修改后就可以被序列化了,其它的类也类似操作:

--------将要被序列化的类,这里以Form为代表--------
using   System;
using   System.Collections.Generic;
using   System.Text;
using   System.Windows.Forms;
using   System.Runtime.Serialization;
using   System.Drawing;

namespace   SerializableApp
{
///   <summary>
///   这里要添加对序列化的支持
///   </summary>
[Serializable]
public   class   SerializableForm   :   Form,   ISerializable
{
///   <summary>
///   常规构造函数
///   </summary>
public   SerializableForm()
{

}
///   <summary>
///   反序列化构造函数
///   </summary>
///   <param   name= "info "> </param>
///   <param   name= "context "> </param>
public   SerializableForm(SerializationInfo   info,   StreamingContext   context)
{
this.Name   =   info.GetString( "Name ");
this.Size   =   (Size)info.GetValue( "Size ",   typeof(Size));
this.Location   =   (Point)info.GetValue( "Location ",   typeof(Point));
}
///   <summary>
///   自定义序列化方法
///   </summary>
///   <param   name= "info "> </param>
///   <param   name= "context "> </param>
public   void   GetObjectData(SerializationInfo   info,   StreamingContext   context)
{
info.AddValue( "Name ",   this.Name);
info.AddValue( "Size ",   this.Size);
info.AddValue( "Location ",   this.Location);
}
}
}

--------------对序列化的测试----------------
//为了方便测试定义内存流
MemoryStream   ms   =   new   MemoryStream();
BinaryFormatter   form   =   new   BinaryFormatter();

Type   type   =   typeof(SerializableForm);
object   obj   =   Activator.CreateInstance(type);
//对对象进行序列化
form.Serialize(ms,   obj);
ms.Flush();
//获取流中的数据以便反序列化
byte[]   bts   =   ms.GetBuffer();

//反序列化操作
MemoryStream   _ms   =   new   MemoryStream(bts);
//生成反序列化后的对象
object   ff   =   form.Deserialize(_ms);

原创粉丝点击