关于反射参数序列化找不到****程序集问题

当dll通过Assembly类动态加载时,dll 内的结构体需要序列化保存进,在反序列化时就会,弹出提示,无法找到程序集的问题

解决方法:

1 加载dll

  fsinfo.FullName:dll路径

  assembly = Assembly.LoadFile(fsinfo.FullName);

  //确定您加载的类,格式:命名空间.类名
  string callname = fsinfo.Name.Replace(".dll", ".ElementClass");

//加载类
  type = assembly.GetType(callname);

  //第二个类
  callname = fsinfo.Name.Replace(".dll", ".ElementParameter");
  type2 = assembly.GetType(callname);

2 查类的方法和变量

  //得到方法集合

  MemberInfo[] member= type2.GetMembers();

  //得到变量
  FieldInfo[] fieldInfo = type2.GetFields();

3实例化类对象

   object ojb = System.Activator.CreateInstance(type2);

  设定变量值

  fieldInfo[16].SetValue(ojb, "123456");

4 序列化

  string sdata = "";
  serializeObjToStr(ojb, out sdata);

5 反序列化

  object newobj;
  deserializeStrToObj(sdata, ojb.GetType(),out newobj);

以下是序列化函数

/// <summary>
/// 序列化
/// </summary>
/// <param name="obj">对象</param>
/// <param name="serializedStr">序列化字符串</param>
/// <returns>结果</returns>
public static bool serializeObjToStr(Object obj, out string serializedStr)
{
  bool serializeOk = false;
  serializedStr = "";
  try
  {
    MemoryStream memoryStream = new MemoryStream();
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(memoryStream, obj);
    serializedStr = System.Convert.ToBase64String(memoryStream.ToArray());

    serializeOk = true;
  }
  catch (Exception ex)
  {
    serializeOk = false;
  }

return serializeOk;
}


/// <summary>
/// 反向序列化
/// </summary>
/// <param name="serializedStr">要序列化的字符串</param>
/// <param name="deserializedObj">对象</param>
/// <returns>结果</returns>
public static bool deserializeStrToObj(string serializedStr,Type objectType, out object deserializedObj )
{
  bool deserializeOk = false;
  deserializedObj = null;

  try
  {
    byte[] restoredBytes = System.Convert.FromBase64String(serializedStr);
    MemoryStream restoredMemoryStream = new MemoryStream(restoredBytes);
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    IFormatter formatter =new BinaryFormatter();
    UBinder uBinder = new UBinder();
    uBinder.addMapInfo(objectType);
    formatter.Binder = uBinder;
    deserializedObj = formatter.Deserialize(restoredMemoryStream);

    deserializeOk = true;


   }
   catch (Exception ex)
    {
      deserializeOk = false;
    }

    return deserializeOk;
  }

依据http://www.mamicode.com/info-detail-893603.html的提示作了些改动
public class UBinder : SerializationBinder
{
  Type Data;
  public void addMapInfo(Type data)
  {
    Data = data;
  }
  public override Type BindToType(string assemblyName, string typeName)
  {
    Assembly ass = this.Data.Assembly;  /// Assembly.GetExecutingAssembly();

    //这部分可以不加
    Type type= ass.GetType(typeName);
    if (type ==null)
    {
      ass= Assembly.GetExecutingAssembly();
      type = ass.GetType(typeName);
    }

    return ass.GetType(typeName);
  }
}

经过改动后就可以通过反序列化了

posted on 2018-03-17 21:14  xingbeiSoftware  阅读(516)  评论(0)    收藏  举报

导航