上周我问了这个关于如何手动序列化对象的问题,此后我一直在尝试制作通用包装器来解决我的问题。(我这样做是因为我被困在第 3 方代码之间。)除了事件之外,我几乎所有的东西都在工作。
由于我在反序列化时在技术上创建了对象的新实例,因此我不再保留我的事件订阅。有没有办法复制订阅,或者将反序列化版本的所有事件转发回原始版本?
这是类似于我目前使用的东西:
[Serializable]
public class Wrapper<T> : ISerializable
{
public T Wrappee { get; set; }
public Wrapper(T wrappee)
{
Wrappee = wrappee;
}
protected Wrapper(SerializationInfo info, StreamingContext context)
{
Wrappee = (T)FormatterServices.GetUninitializedObject(typeof(T));
FieldInfo[] fields = typeof(T).GetFields();
foreach (FieldInfo fieldInfo in fields)
{
var value = info.GetValue(fieldInfo.Name, fieldInfo.FieldType);
fieldInfo.SetValue(Wrappee, value);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
FieldInfo[] fields = typeof(T).GetFields();
foreach (FieldInfo fieldInfo in fields)
{
var value = fieldInfo.GetValue(Wrappee);
info.AddValue(fieldInfo.Name, value);
}
}
}
嗯,这只是它的一般想法。基本上我想知道是否有一种方法可以对事件进行类似于我为字段所做的事情。我知道我可以以同样的方式获得 EventInfo,但我不知道这将如何转化为修复订阅。
任何帮助将不胜感激。
编辑 所以我仍在试图找到一种方法来做到这一点,我遇到了这个问题。我可以做这样的事情,然后将事件转发回原来的 appdomain 而不必修复订阅吗?