У меня есть почти сто классов сущностей, которые выглядят так:
[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
делает это)