В Silverlight у меня есть DataContract
:
[DataContract]
class Operation
{
[DataMember]
public string Name;
public readonly OperationManager Manager = new OperationManager();
}
Я не хочу хранить или сериализовать Менеджер, поэтому он не является DataMember
. При выполнении new Operation()
диспетчер не имеет значения null. Но когда я извлекаю его из IsolatedStorageSettings
, я получаю нулевой менеджер:
// operation.Manager is not null
var Settings = IsolatedStorageSettings.ApplicationSettings;
Settings["key"] = operation;
Settings.Save();
operation = (Operation)Settings["key"];
// operation.Manager is null
Есть ли способ автоматически повторно инициализировать диспетчер для чего-то нового, когда он неэтериализуется с помощью IsolatedStorageSettings
? Я попытался установить его в конструкторе, но конструктор не вызывается, когда происходит через IsolatedStorageSettings
.
Решение инициализировать нечто, приходящее из IsolatedStorageSettings
либо [OnDeserializing]
или [OnDeserialized]
(может не использовать .ctor(SerializationInfo info, StreamingContext context)
, как не доступный на Silverlight).
[DataContract]
class Operation
{
[DataMember]
public string Name;
OperationManager _manager = new OperationManager();
public OperationManager Manager { get { return _manager; } }
[OnDeserializing]
#if WP7
internal
#endif
void OnDeserializing(StreamingContext c)
{
_manager = new OperationManager();
}
}
[OnDeserializing]
и [OnDeserialized]
должны быть внутренними на Windows Phone 7 и приватными на Visual Studio 2013. -_-
У меня нет опыта работы с Silverlight или IsolStorageSettings, поэтому я не знаю, есть ли какие-либо специальные трюки, но простым решением было бы использовать свойство и в случае необходимости создать экземпляр OperationManager
.
private OperationManager manager; // no longer readonly
public OperationManager Manager
{
get
{
if (manager == null) manager = new OperationManager();
return manager;
}
}
get
. Если я неget
в какой-то момент, OperationManager не создается. И мне нужен экземпляр этого для выполнения автоматических фоновых задач. Я искал способ инициализировать его, как только, например, будет доступен доступ кSettings["key"]
.