Выполнение DeepCopy (клон), когда присоединены события - PullRequest
0 голосов
/ 27 октября 2010

Если у вас есть объект, который предоставляет события, и вы используете подход клонирования (сериализации) для клонирования объекта, как вы это делаете, когда есть события на объекте, которые фактически присоединены.

Если мойобъект объявляет событие, но ничего не присоединяется, тогда объект можно без проблем клонировать.

НО, если к объекту были прикреплены события, сериализация завершится неудачно.Все ассоциированные классы имеют свой атрибут 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

1 Ответ

0 голосов
/ 27 октября 2010

Добавьте [field: NonSerialized] к объявлению события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...