オブジェクトをAction
から作成したDelegate
オブジェクトをシリアル化すると、オブジェクトを逆シリアル化でき、Delegate
はまだサブスクリプションされていますか?ここオブジェクトからアクションから作成されたデリゲートがあるオブジェクトをシリアル化するにはどうすればよいですか?
クラスコードである:
var testClass = new TestClass();
testClass.AddHandlerForAction();
testClass.RaiseEvent();
var clone = testClass.Clone();
例外コード行で発生する:ここ
formatter.Serialize(stream, this);
ここ
[Serializable]
public class TestClass
{
public event EventHandler<EventArgs> refresh;
public void AddHandlerForAction()
{
var methodInfo = this.GetType().GetMethod("RefreshMethodNoParamaters");
Action action = (Action)Delegate.CreateDelegate(typeof(Action), this, methodInfo);
var eventInfo = this.GetType().GetEvent("refresh");
var handlerType = eventInfo.EventHandlerType;
var eventParams = handlerType.GetMethod("Invoke").GetParameters();
var parameters = eventParams.Select(p => Expression.Parameter(p.ParameterType, "x"));
var body = Expression.Call(Expression.Constant(action), action.GetType().GetMethod("Invoke"));
var lambda = Expression.Lambda(body, parameters.ToArray());
Delegate d = Delegate.CreateDelegate(handlerType, lambda.Compile(), "Invoke", false);
eventInfo.AddEventHandler(this, d);
}
public virtual object Clone()
{
Type type = this.GetType();
if (!type.IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
if (Object.ReferenceEquals(this, null))
{
return this.GetType().GetMethod("GetDefaultGeneric").MakeGenericMethod(type).Invoke(this, null);
}
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);
stream.Position = 0;
var clone = Convert.ChangeType(formatter.Deserialize(stream), type);
return clone;
}
}
public void RaiseEvent()
{
EventHandler<EventArgs> eventHandler = refresh;
if (eventHandler != null)
{
eventHandler(this, new EventArgs());
}
}
public void RefreshMethodNoParamaters()
{
}
}
は例外を実行するコードであります例外は次のとおりです。
タイプ 「System.Runtime.Serialization.SerializationException」の未処理の例外は がmscorlib.dllで
発生しました追加情報:デリゲート 作成者のアセンブリ外のアンマネージド 関数ポインタ、動的メソッドまたはメソッドの上に、デリゲートをシリアル化することはできません。
コードの目的は、Event
が発生したときに呼び出されるメソッドにパラメータがないEvent
に加入することです。
あなたがバイトに戻ることを避けてください:http://stackoverflow.com/a/40780504/66372。この回答は問題を非常にうまく説明しており、代替案を推奨しています:http://stackoverflow.com/a/1133465/66372 – eglasius