У меня есть почти сто классов сущностей, которые выглядят так:
[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], и их нужно будет сохранить. Как мне это сделать?
Решения, которые я рассматриваю:
- full
ISerializable- пользовательская сериализация требует написания большого количества кода, я бы предпочел не делать этого - используя атрибуты
[OnSerializing]и[OnDeserializing]для сериализацииPropertyChangedвручную, но эти вспомогательные методы предоставляют толькоSerializationContext, которые AFAIK не хранит данные сериализации (SerializationInfoделает это)