栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C# 关于反序列化本地文件无法获取程序集问题的解决办法

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C# 关于反序列化本地文件无法获取程序集问题的解决办法

        如果你在一个的窗体项目中生成了序列化的二进制文件保存在本地,然后在另一个窗体项目中要访问该二进制文件,如果不做处理,则你在新的项目中是无法正常访问另一个项目中生成的二进制文件的,因为序列化时把序列化类的名称空间等信息保存了,但新的应用程序的名称空间和类库的名称空间是不一样的,所以找不到程序集。此时解决办法如下:

        首先,把原先生成二进制的窗体项目变成程序集的形式,添加到新的项目的引用中,原先的窗体项目变成程序集的方法是在“解决方案资源管理器”中修改原先的项目属性中“应用程序”中将“输出类型”的选项由“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);
        }

       

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号