Избегайте пустых полей после хранения в IsolatedStorageSettings

1

В 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.

Теги:
silverlight
datacontract
isolatedstorage

2 ответа

0

Решение инициализировать нечто, приходящее из 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. -_-

0

У меня нет опыта работы с Silverlight или IsolStorageSettings, поэтому я не знаю, есть ли какие-либо специальные трюки, но простым решением было бы использовать свойство и в случае необходимости создать экземпляр OperationManager.

private OperationManager manager; // no longer readonly

public OperationManager Manager
{
    get
    {
        if (manager == null) manager = new OperationManager();
        return manager;
    }
}
  • 0
    Но тогда это не является ненулевым на get . Если я не get в какой-то момент, OperationManager не создается. И мне нужен экземпляр этого для выполнения автоматических фоновых задач. Я искал способ инициализировать его, как только, например, будет доступен доступ к Settings["key"] .
  • 0
    @ Cœur Если вам это нужно только для этого, то почему оно в классе Operation? Вам нужен один OperationManager для каждого экземпляра Operation?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню