Caliburn.Micro 1.1中的自定义序列化

时间:2011-07-12 15:08:26

标签: windows-phone-7 caliburn.micro tombstoning

我正在将1.0 WP7应用程序升级到CM 1.1。除此之外,我正在删除旧的基于属性的逻辑删除和实现存储类。

这通常涉及为每个VM创建一个用于存储目的的类,从StorageHandler<T>(其中T是VM的类型)派生它并覆盖其Configure方法,例如:

public override void Configure()
{
  Property(x => x.SomeSerializableProperty).InPhoneState().RestoreAfterViewLoad();
  // ...
}

在这种情况下,如何使用我自己的序列化/反序列化代码为无法自动序列化的对象实现自定义序列化机制?例如,我的一个VM有StrokeCollection属性,我想序列化其中的笔画,但为此我需要替换会引发安全异常的默认机制。

有没有人可以展示假的CM WP7示例来说明如何自定义某些属性的序列化,以便我可以放置自己的代码来序列化/反序列化它? 谢谢!

1 个答案:

答案 0 :(得分:3)

我不知道这是不是正确的道路,但它有效;这是一个代码示例:

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)似乎在恢复方面存在问题(它会引发模糊的匹配反射异常)。