Почему BinaryFormatter пытается сериализовать событие для класса Serializable? - PullRequest
11 голосов
/ 22 февраля 2010

У меня есть простой класс, который помечен как Serializable, и у него есть событие.Я пытался пометить элемент события как NonSerialized, однако компилятор жалуется.Тем не менее, когда я иду сериализовать экземпляр класса, BinaryFormatter выдает исключение, что событие не сериализуемо.Значит ли это, что вы не можете сериализовать классы, которые имеют события?Если это так, то компилятор должен сказать об этом заранее.

Stream file = File.Open("f", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();

object obj = null;
try
{
    obj = bf.Deserialize(file);
}
catch (System.Runtime.Serialization.SerializationException e)
{
    MessageBox.Show("De-Serialization failed : {0}", e.Message);
}
file.Close();

System.Collections.ArrayList nodeList = obj as System.Collections.ArrayList;

foreach (TreeNode node in nodeList)
{
    treeView.Nodes.Add(node);
}

Не работает на следующем классе:

[Serializable()]
class Simple
{
    private int myInt;
    private string myString;
    public event SomeOtherEventDefinedElsewhere TheEvent;

}

Ответы [ 3 ]

20 голосов
/ 22 февраля 2010

"В случае событий вы также должны добавить квалификатор атрибута поля, когда применение атрибута NonSerialized так что атрибут применяется к основной делегат, а не само событие " Расширенная сериализация - MSDN


Префикс NonSerializedAttribute с полем

[field:NonSerialized]
public event MyEventHandler MyEvent;
0 голосов
/ 07 августа 2015

Я знаю, что это поздний пост, но вот фактический ответ на этот вопрос. Создайте вручную добавьте / удалите «getters / setters» для вашего события (компилятор сделает это за вас за кадром, но в этом случае вы должны сделать это явно), а затем пометьте ваше событие как NonSerialized. У меня нет времени выложить код для вас, но быстрый поиск показывает, кто столкнулся с той же проблемой:

http://sanity -free.org / 113 / csharp_binary_serialization_oddities.html

Однако не используйте эту строку: [MethodImpl (MethodImplOptions.Synchronized)] * ​​1008 *

Это приводит к проблемам безопасности потоков, которые были исправлены в C # 4; см .:

http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events-get-a-little-overhaul-in-c-4-part-i-locks.aspx

Вам нужно будет либо свернуть свою собственную альтернативу без блокировки (используя CAS), либо найти ее в Интернете; к сожалению, у меня нет времени, потому что мне нужно бежать, но вы поняли.

Надеюсь, это поможет!

0 голосов
/ 22 февраля 2010

Важно помнить, что атрибут [Field:NonSerialized] применяется к делегатам, а не к событиям, кстати, с учетом регистра, затем реализует объект ISerializable и, используя отражение, выполняет итерацию по сериализуемому вами классу, ищите обработчик событий и отмените подписку на события перед сериализацией. Затем при выполнении десериализации вы можете при необходимости автоматически связать события при десериализации ...

...