И я должен помнить, что десериализованный граф объектов содержит новые объекты, старые ссылки больше не работают. D'о!
я есть почти сотня классов сущностей, выглядящих так:
[Serializable]
public class SampleEntity : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return this.name; }
set { this.name = value; FirePropertyChanged("Name"); }
}
[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
private void FirePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
Обратите внимание на[field:NonSerialized]
атрибут наPropertyChanged
, Это необходимо, поскольку некоторые из наблюдателей (в моем случае - сетка, отображающая сущности для редакции) могут быть не сериализуемыми, а сущность должна быть сериализуемой, поскольку она обеспечивается - посредством удаленного взаимодействия - приложением, работающим на машине-разделителе ,
Это решение отлично работает для тривиальных случаев. Однако, возможно, что некоторые из наблюдателей[Serializable]
и должен быть сохранен. Как мне справиться с этим?
Решения, которые я рассматриваю:
полныйISerializable
- пользовательская сериализация требует написания большого количества кода, я бы предпочел не делать этогос помощью[OnSerializing]
а также[OnDeserializing]
атрибуты для сериализацииPropertyChanged
вручную - но эти вспомогательные методы обеспечивают толькоSerializationContext
, который AFAIK не хранит данные сериализации (SerializationInfo
делает это)