【C#】序列化、反序列化汇总

一、持续序列化对象追加到文件的方法

https://www.cnblogs.com/luxishi/p/9172407.html

二、反序列化时程序集名称不同导致错误

折腾了好久终于解决了这个问题,官方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;
            }
        }

 

posted @ 2021-09-23 17:47  不溯流光  阅读(203)  评论(0编辑  收藏  举报