C# 二进制序例化LIst<T> 解决办法

问题 :在类标记为   [Serializable]  便可以序列化,如果成员中包含有范型字段,在反序列化时会报 不能加载类.......错误。

解决办法:

第一、新增一个该字段的数组类替代范型存序列化和反序列化。

第二、如果该范型定义在同一命名空间,可以采用重写 SerializationBinder 直接返回该范型类型;

public class UBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{

try
{
if (typeName.Contains("List") == true && typeName.Contains(typeof(ConfigItemParam).Name) == true) // 如果是泛型集合
{
return typeof(List<ConfigItemParam>); // 直接返回反序列化的类型
}
Assembly ass = Assembly.GetExecutingAssembly();
Type t = ass.GetType(typeName);
return t;
}
catch (Exception ex)
{

throw;
}
}
}

第三、如果该LIST<T> 中的T 定义在不同的命名空间,在.net 4.0 下可以序列化,需要重写SerializationBinder  

public class UBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{

try
{
mbly ass = Assembly.GetExecutingAssembly();
Type t = ass.GetType(typeName);
return t;
}
catch (Exception ex)
{

throw;
}
}
}

下面给出序列化和反序列化代码 

#region 序例化和反序例化
public static byte[] SerializeObject(object obj)
{
if (obj == null)
return null;
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
ms.Close();
return bytes;
}


/// <summary>
/// 把字节数组反序列化成对象
/// </summary>
public static object DeserializeObject(byte[] bytes)
{
object obj = null;
if (bytes == null)
return obj;
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
formatter.Binder = new UBinder();

try
{

obj = formatter.Deserialize(ms);
}
catch (Exception ex)
{

throw;
}
ms.Close();
return obj;
}
#endregion

 

转载于:https://www.cnblogs.com/cdxy2005/p/9054969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值