C# BinaryFormatter序列号和反序列化 失败问题

异常问题:改变类的命名空间后不能用的BinaryFormatter反序列化。

详细异常:{"[A] XXXX Config 无法强制转换为 [B] XXXX Config。类型 A 源自“Viewer, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null”(在上下文“Default”中的“AAAAAAAAAAA”位置处)。类型 B 源自“SetingConfig, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“Default”中的“BBBBBBBBBBB”位置处)。"}

解决方法:添加“USerializationBinder ”类,重载BindToType方法。

    public class USerializationBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Assembly ass = Assembly.GetExecutingAssembly();
            return ass.GetType(typeName);
        }
    }

引用示例:

public void SaveTo(string fileName)
{
	using (MemoryStream ms = new MemoryStream())
	{
		IFormatter formatter = new BinaryFormatter();
		formatter.Binder = new USerializationBinder();
		formatter.Serialize(ms, this);
		File.WriteAllBytes(fileName, ms.ToArray());
	}
}
public static DSConfig LoadFromFile(string fileName)
{
	try
	{
		if (!File.Exists(fileName))
			return null;
		else
		{
			byte[] buff = File.ReadAllBytes(fileName);
			using (MemoryStream ms = new MemoryStream(buff))
			{
				IFormatter formatter = new BinaryFormatter();
				formatter.Binder = new USerializationBinder();
				return (Config)formatter.Deserialize(ms);
			}
		}
	}
	catch (Exception ex)
	{
	
	}
	return null;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#序列化反序列化是将对象转换为容易传输的格式,并重新解析构造被序列化的对象的过程。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要将对象转换为字节序列,才能在网络上传送;接收方则需要将字节序列再转换为对象。 为什么要序列化反序列化呢?我们经常需要将对象的字段值保存在磁盘中,并在以后检索这些数据。尽管不使用序列化也能完成这项工作,但这样的方法通常繁琐而且容易出错。当需要跟踪对象的层次结构时,使用序列化会变得越来越复杂。对于包含大量对象的大型业务应用程序来说,程序员不得不为每个对象编写代码来保存和还原字段和属性。序列化提供了一种轻松实现这个目标的快捷方法。.NET框架通过使用反射提供自动的序列化机制,它会将对象序列化后的类名称、程序集以及类实例的所有数据成员写入存储媒体中。 .NET框架提供了多种序列化方式,包括BinaryFormatter、SoapFormatter和XmlSerializer。BinaryFormatter提供了一个简单的二进制数据流以及某些附加的类型信息;SoapFormatter将数据流格式化为XML存储;XmlSerializer也是将数据流格式化为XML存储,但相对于SoapFormatter来说更简化。可以使用[Serializable]属性将一个类标记为可序列化的。如果某个类的成员不想被序列化,可以使用[NonSerialized]属性来标记,或者使用[XmlIgnore]属性来标记。 总结一下,C#序列化反序列化是将对象转换为容易传输的格式,并重新解析构造被序列化的对象的过程。它在两个进程进行远程通信、保存和检索对象字段值等场景下发挥着重要作用。.NET框架提供了多种序列化方式,并通过使用属性来控制哪些成员需要被序列化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值