【问题标题】:Avoid null field after storage in IsolatedStorageSettings在 IsolatedStorageSettings 中存储后避免空字段
【发布时间】:2014-08-25 10:03:48
【问题描述】:

在 Silverlight 上,我收到了这样的 DataContract

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

    public readonly OperationManager Manager = new OperationManager();
}

我不想存储或序列化 Manager,这就是它不是 DataMember 的原因。 Manager 在执行new Operation() 时不为空。但是当我从IsolatedStorageSettings 检索它时,我得到一个空的Manager

// 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时没有调用构造函数。

【问题讨论】:

    标签: c# silverlight isolatedstorage datacontract


    【解决方案1】:

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

    private OperationManager manager; // no longer readonly
    
    public OperationManager Manager
    {
        get
        {
            if (manager == null) manager = new OperationManager();
            return manager;
        }
    }
    

    【讨论】:

    • 但它只是在get 上不是非空的。如果我在某些时候不get,则 OperationManager 不会被实例化。我需要它的一个实例来执行自动后台任务。例如,我正在寻找一种在访问 Settings["key"] 时立即对其进行初始化的方法。
    • @Cœur 如果您只需要它,那么为什么它在 Operation 类中?每个 Operation 实例都需要一个 OperationManager 吗?
    • 是的。我已经简化了我的示例,但我需要为每个实例创建一个实例。
    • @Cœur 但它必须是 Operation 类的字段吗?如果不是,您可以在反序列化操作时创建一个管理器对象。但看起来你简化了你的问题有点太多了。抱歉,如果这个答案没有真正的帮助,但我会让它留下来,因为它可能会向其他人展示您在寻找什么。
    【解决方案2】:

    初始化来自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 上必须是私有的。-_-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      相关资源
      最近更新 更多