zoukankan      html  css  js  c++  java
  • 【C#】反序列化时程序集名称不同导致错误

    折腾了好久终于解决了这个问题,官方yyds

    https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.serialization.serializationbinder?view=net-5.0

    反序列化代码:

           public static bool FileLoad(string Fliepath)
            {
                bool res = false;
                AA = new DataClass();
                try
                {
                    FileStream load_read = File.Open(Fliepath, FileMode.Open, FileAccess.Read, FileShare.None);
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Binder = new UBinder();  //关键语句
                    AA= bf.Deserialize(load_read) as DataClass;
                    load_read.Close();
                    res = true;
                }
                catch (System.Exception ex)
                {
                    res = false;
                    System.Windows.MessageBox.Show(ex.ToString());
                }
                return res;
            }

    在Class外面添加:

            public class UBinder : SerializationBinder
            {
                /// <summary>
                /// 获取反序列化所需的类型
                /// </summary>
                /// <param name="assemblyName">待读取文件的程序集信息</param>
                /// <param name="typeName">待读取文件的反序列化所需的类型</param>
                /// <returns></returns>
                public override Type BindToType(string assemblyName, string typeName)
                {
                    //例如,当前待读取的二进制文件在程序集AAAA中创建,序列化类型是AAAA.UserClass.Parameter.DataClass
                    //新的程序集名称为BBBB,序列化类型是BBBB.Parameter.DataClass
                    //那么这个函数的输入参数就是
                    //assemblyName="AAAA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
                    //typeName="AAAA.UserClass.Parameter+DataClass"
    
                    Type typeToDeserialize = null; //反序列化所需的类型
    
                    String assemVer1 = Assembly.GetExecutingAssembly().FullName;//当前项目的程序集信息
                    //即assemVer1 = "BBBB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    
                    String typeVer1 = "AAAA.UserClass.Parameter+DataClass";
    
                    if (typeName == typeVer1)//更新typeName
                    {
                        //assemblyName = assemblyName.Replace("1.0.0.0", "2.0.0.0");//如果版本号不同就加上
                        typeName = "BBBB.Parameter+DataClass";
                    }
    
                    typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                        typeName, assemVer1)); //得到新类型
    
                    return typeToDeserialize;
                }
            }
    /*******相与枕藉乎舟中,不知东方之既白*******/
  • 相关阅读:
    支付
    REST framework补充
    Django与Ajax
    Django 模型层ORM
    Django简介
    Web应用
    Docker配置pycharm连接
    Docker 网络扩展
    Docker 之Docker-Compose
    Docker 之Dockerfile
  • 原文地址:https://www.cnblogs.com/Mars-0603/p/15325297.html
Copyright © 2011-2022 走看看