【问题标题】:Deserialization validation反序列化验证
【发布时间】:2009-02-08 16:21:20
【问题描述】:

我正在处理使用DataContractSerializer 序列化和反序列化的字体列表。在这两个步骤之间,可以想象用户已经从他们的机器中删除了一种字体。我想检查一个字体名称,因为它正在被反序列化以确保它仍然存在于系统上。如果不存在,则该元素不包含在DataContractSerializer.ReadObject() 返回的集合中。

具体来说,我正在存储一个FontFamily 并序列化一个获得FontFamily.Name 的属性。在此属性的 set 访问器中,我将字符串转换回 FontFamily

我能想到的唯一合理的验证替代方法是让属性的 set 访问器忽略无效值,然后过滤掉无效的反序列化对象。但是,我不喜欢这个选项 - 有没有更合适的方法?

【问题讨论】:

    标签: c# validation serialization


    【解决方案1】:

    为什么不利用 OnDeserializedAttribute?让您的回调执行对客户端环境无效的项目的验证和删除。

    http://msdn.microsoft.com/en-us/library/ms733734.aspx

    如果您在后台删除或修改数据,我确实有些担心您将如何往返数据。

    (例如:当我在连接到两台不同打印机的两台不同机器上处理文档时,我记得对旧版本的 MS Publisher 感到特别沮丧。每当我在一台机器上修改文件时,Publisher 都会重新格式化文档以连接到那台机器的打印机为目标。当我回到另一台机器进行实际打印时,Publisher 将再次重新格式化,但边距不太正确,因此我需要进行更多调整。 )

    【讨论】:

    • 我想应该没问题。我仍然不喜欢仍然创建无效项目的想法,但我想在这种情况下我可以忍受它。回复:数据可移植性,目前,我不会担心使序列化文件可在多台机器上使用。也许以后。
    【解决方案2】:

    您还可以为您的类实现IXmlSerializable,这将包括您自己的ReadXml 实现,允许您在对象被反序列化时进行任何您想要的验证。

    【讨论】:

    • 虽然有效,但需要做很多额外的工作……对于 XmlSerializer(它不执行回调),这是唯一的方法,但对于 DataContractSerializer,回调路由更可取。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2017-02-01
    • 2021-02-21
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多