在IsolatedStorageSettings中存储后避免使用空字段

时间:2014-08-25 10:03:49

标签: c# silverlight isolatedstorage datacontract

在Silverlight上,我得到了DataContract这样:

[DataContract]
class Operation
{
    [DataMember]
    public string Name;

    public readonly OperationManager Manager = new OperationManager();
}

我不想存储或序列化 Manager ,这就是为什么它不是DataMember。在执行new Operation()时, Manager 不为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进行反序列化时,有没有办法自动将 Manager 重新初始化为新内容?我试图在构造函数中设置它,但是在通过IsolatedStorageSettings时没有调用构造函数。

2 个答案:

答案 0 :(得分:0)

我没有使用Silverlight或IsolatedStorageSettings的经验,因此我不知道是否有任何特殊技巧,但一个简单的解决方案是使用属性并在必要时实例化OperationManager。 / p>

private OperationManager manager; // no longer readonly

public OperationManager Manager
{
    get
    {
        if (manager == null) manager = new OperationManager();
        return manager;
    }
}

答案 1 :(得分: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上必须是私有的。-_-