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

猜你喜欢

转载自www.cnblogs.com/cdxy2005/p/9054969.html