TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
当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);
}
}
经过改动后就可以通过反序列化了 |
|