У меня есть IPC-сервер, работающий с некоторым действительно простым интерфейсом, который работает вполне нормально. Сам интерфейс очень прост и состоит всего из 4-х методов. (RemoteCall Метод SingleTone):Serializationexception даже с [поле: NonSerialized]
[Serializable]
public class NetworkHook : MarshalByRefObject
{
public void onIsInstalled(int pid, MessageDirection direction)
{
}
public void onDataRecieved(int pid, MessageDirection direction, byte[][] data)
{
}
public void onException(int pid, MessageDirection direction, Exception exception)
{
}
public void onPing(int pid, MessageDirection direction)
{
}
}
Неприятности начались, когда я начал добавлять события к этому классу (так что любая часть сервера может подписаться на входящие сообщения, метод удаленного вызова является SingleTone держать eventlisteners). Поскольку NetworkHook является сериализуемым, я начал добавлять теги [field: NonSerialzied] к моим событиям. Это должно быть хорошо, как мне не нужно клиентов, чтобы быть в курсе событий-слушателей (или же они не хотят быть вообще), поэтому их потеря в порядке:
[field: NonSerialized]
public event EventHandler<InstalledEventArgs> Test;
Во всяком случае я все еще получил это ошибки и попробовал другой подход с настраиваемой EventHandler на этот раз:
public delegate void HookInstalledEventHandler(object sender, HookInstalledEventArgs args);
[field: NonSerialized]
public event HookInstalledEventHandler Test;
и снова - я все еще получаю исключение при добавлении слушателей к событию. Таким образом, я попытался переопределить метод сериализации NetworkHook-класса:
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
}
Как у меня нет каких-либо переменных, мне нужно, чтобы сохранить это довольно просто. Но снова - я получаю исключение. Итак, теперь у меня заканчиваются идеи, что я мог бы предотвратить это исключение, или что я делаю неправильно здесь (что делает статичные события выбором, который я действительно не хочу делать)?
Исключение я получаю:
System.Runtime.Serialization.SerializationException wurde nicht behandelt.
Message="Der Typ \"SimpleHookGUI.CommandLineReporter\" in Assembly \"SimpleHookGUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\" ist nicht als serialisierbar gekennzeichnet."
Source="mscorlib"
StackTrace:
Server stack trace:
bei System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
bei System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
bei System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
bei System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)
bei System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
bei System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SerializeMessage(IMessage msg, ITransportHeaders& headers, Stream& stream)
bei System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
bei HookManager.NetworkObserver.NetworkHook.add_Test(HookInstalledEventHandler value)
bei SimpleHookGUI.Program.Main() in xxx\Program.cs:Zeile 24.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:
Я попытался это первый ответ:
[field: NonSerialized]
private event EventHandler<HookInstalledEventArgs> test;
public event EventHandler<HookInstalledEventArgs> Test
{
add { this.test = (EventHandler<HookInstalledEventArgs>) Delegate.Combine(this.test, value); }
remove { this.test = (EventHandler<HookInstalledEventArgs>) Delegate.Remove(this.test, value); }
}
Какое точное исключение? –
Трудно понять, что означает SingleTone. Это Синглтон? Вам действительно нужно публиковать данные об исключениях, включая трассировку стека. –
Я добавил стек исключений в свой первый пост :) – Fge