Если у вас есть объект, который предоставляет события, и вы используете подход клонирования (сериализации) для клонирования объекта, как вы это делаете, когда есть события на объекте, которые фактически присоединены.
Если мойобъект объявляет событие, но ничего не присоединяется, тогда объект можно без проблем клонировать.
НО, если к объекту были прикреплены события, сериализация завершится неудачно.Все ассоциированные классы имеют свой атрибут Serializable (кроме Form1, который используется для тестирования).
Так что в следующем примере, если я вызову Create(true)
, произойдет сбой Clone (см. Исключение в конце).
Если я позвоню Create(false)
, то он будет работать правильно
Пример кода придуман, но, надеюсь, он продемонстрирует, что я пытаюсь сделать.
private void Create(bool useEvent)
{
mRab = new Rabbits();
if (useEvent) mRab.Changed += new Rabbits.ChangedEventHandler(ChangedRabbits);
Rabbit r;
r = new Rabbit();
r.Monkeys.Add(new Monkey("Test"));
mRab.Add(r);
Rabbits r2;
r2 = DeepClone(mRab);
}
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f.Serialize(ms, obj);
ms.Position = 0;
return (T)f.Deserialize(ms);
}
}
Исключение при клонировании, когда событие прикреплено.System.Runtime.Serialization.SerializationException: Тип CSharpClonetest.Form1 в сборке CSharpClonetest, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null 'не помечена как сериализуемая.в System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (тип RuntimeType) в System.Runtime.Serialization.FormatterServices.GetSerializableMembers (Тип тип, контекст StreamingContext) в System.Runtime.Serialization.Formatters.Binary.WefoMject (atfoOject)Runtime.Serialization., Контекст StreamingContext, SerObjectInfoInit, serObjectInfoInit, конвертер IFormatterConverter, ObjectWriter (objectWriter) в System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (WriteObjectInfo objectInfo, NameInfo memberNameInfo.fo.Nerject.Inter.Inject.Inject.Inject.Inject.Inject.IntoIn.Inter.Serialize (объектный граф, заголовок [] inHeaders, __BinaryWriter serWriter, логическое значение fCheck) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (поток serializationStream, граф объекта, заголовки [], логический fCheck) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (поток serializationStream, граф объектов) в CSharpClonetest.Form1.DeepClone [T] (T obj) в C: \ Development \ Spikes \ TestDeepCloneEvent \ CSharpClonetest \ Form1.cs: строка 30