在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
时没有调用构造函数。
答案 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上必须是私有的。-_-