如果你在一个的窗体项目中生成了序列化的二进制文件保存在本地,然后在另一个窗体项目中要访问该二进制文件,如果不做处理,则你在新的项目中是无法正常访问另一个项目中生成的二进制文件的,因为序列化时把序列化类的名称空间等信息保存了,但新的应用程序的名称空间和类库的名称空间是不一样的,所以找不到程序集。此时解决办法如下:
首先,把原先生成二进制的窗体项目变成程序集的形式,添加到新的项目的引用中,原先的窗体项目变成程序集的方法是在“解决方案资源管理器”中修改原先的项目属性中“应用程序”中将“输出类型”的选项由“Windows 应用程序”变为“类库”,然后编译整个工程,在执行文件的根目录下选择xxx.dll文件,将该文件拷贝到新的项目中的可执行文件的目录下,然后在新的项目的“解决方案资源管理器”中的“引用”部分添加原来项目的xxx.dll文件。然后在新的项目中引用命名空间;
然后可采用下面两种方法进行反序列化操作
公共代码部分,添加一个这样的类,用于获取反序列化文件的
using System.Reflection; //根据反射获取要访问的信息
using xxxxx;//程序集中要访问的名称空间
public class UBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Assembly ass = Assembly.GetExecutingAssembly();
return ass.GetType(typeName);
}
}
下面为实现的两种方法,其中ChannelPara为自己反序列化的类的命名
protected void ReadHistoryProtocolCallback(object _file_name)
{
string file_name = _file_name as string;
//方法1,可行
BinaryFormatter binFormat = new BinaryFormatter(); //创建二进制序列化器;
binFormat.Binder = new UBinder();
using (FileStream fs = File.OpenRead(file_name))
{
while (fs.Position < fs.Length)
{
channel_para = (ChannelPara)binFormat.Deserialize(fs);
}
fs.Close();
fs.Dispose();
}
//方法2,也可行
//byte[] byteArray;
//int nBytes;
//using (FileStream fs = File.OpenRead(file_name))
//{
// nBytes = (int)fs.Length; //计算流的长度
// byteArray = new byte[nBytes]; //初始化用于MemoryStream的Buffer
// int nBytesRead = fs.Read(byteArray, 0, nBytes); //将File里的内容一次性的全部读到byteArray中去
// fs.Close();
// fs.Dispose();
//}
//IFormatter formatter = new BinaryFormatter();
//formatter.Binder = new UBinder();
//MemoryStream stream = new MemoryStream(byteArray, 0, nBytes);
//channel_para = (ChannelPara)formatter.Deserialize(stream);
//开始进行界面还原
TableDataGridViewWorkInvoke(CustomControlProtocolDataGridView, channel_para.ChannelOnceDescribeList);
}



