我正在将一个1.0 WP7应用程序升级到CM 1.1。除其他事项外,我正在删除旧的基于属性的墓碑并实现存储类。
这通常涉及为每个VM创建一个用于存储目的的类,从StorageHandler<T>
派生它(其中T是VM的类型)并覆盖它的Configure
方法,例如:
public override void Configure()
{
Property(x => x.SomeSerializableProperty).InPhoneState().RestoreAfterViewLoad();
// ...
}
在这种情况下,我如何使用自己的序列化/反序列化代码来实现不能自动序列化的对象的自定义序列化机制?例如,我的一个虚拟机有一个StrokeCollection
属性,我想序列化其中的笔画,但为此,我需要替换会引发安全异常的默认机制。
我不知道这是否是正确的路径,但它的工作;下面是一个代码示例:
Property(x => x.Strokes).InPhoneState().RestoreAfterViewReady().Configure(x =>
{
x.Save = SaveStrokes;
x.Restore = RestoreStrokes;
});
的实现如下:
void SaveStrokes(BoardViewModel vm, Func<string> serialize, StorageMode nMode)
{
IsolatedStorageSettings.ApplicationSettings[vm.DisplayName + "ThePropertyKey"] =
// ...get data from vm and serialize
}
和相反:
void RestoreStrokes(BoardViewModel vm, Func<string> serialize, StorageMode nMode)
{
// use IsolatedStorageSettings.ApplicationSettings[vm.DisplayName + "ThePropertyKey"]
// to check if the key exists, and if it is there get the serialized data and deserialize
}
至于笔画,我使用我自己的序列化类作为我为此目的的常用工具(SharpSerializer)似乎在恢复方面有问题(它抛出一个模糊的匹配反射异常)。