2009-09-24 170 views
0

我正在寻找一种将Silverlight对象保存到用户PC的方法,然后重新水化它们以便用户可以完成编辑它们。Silverlight序列化/反序列化问题

序列化与DataContractSerializer并坚持IsolatedStorageFile工作正常。但是,反序列化会导致问题。下面是导致失败的代码:

private string _FirstNames = string.Empty; 
public string FirstNames 
{ 
    get { return _FirstNames; } 
    set 
    { 
     new PersonNameValidator().Validate(value); //<-- BOOM 8(
     Set(ref _FirstNames, value,() => this.FirstNames); 
    } 
} 

的解串器调用属性setter,这又抛出一个异常并中止deserialisation。

我已经试过明确将DataContract/DataMember/IgnoreDataMember属性,但后来它不与私人领域发挥很好:

System.Security.SecurityException 发生消息=“数据合同 类型 “Trident.Model.Journey.JourneyApplication” 无法序列,因为 成员“_TravellerSavingsAmount”是 不公开。制作成员公共 将修复这个错误。另外, 您可以使其内部,并使用您的程序集上的 InternalsVisibleToAttribute属性 为了启用 序列化的内部成员 - 请参阅文档的更多详细信息。要 注意,这样做有一定的 安全隐患。”

我怎样才能deserialisation期间绕过属性setter?

我想继续我的课集中在域,并没有太多污染与

回答

0

一对夫妇的想法基础设施问题:

  • 序列化只用于序列化的属性,从而绕过任何VA lidation
  • 序列化父类并使用派生类进行验证
+0

Thanks Joel。我考虑了第一点,但不喜欢为了支持序列化而添加额外的公共属性/字段的想法。 至于使用派生类:这可能会很麻烦,因为我的对象图的复杂性增加。我不想编写自定义例程来处理我创建的每个对象图。 – 2009-09-24 16:06:53