代码之家  ›  专栏  ›  技术社区  ›  Matthew Maravillas

反序列化验证

  •  2
  • Matthew Maravillas  · 技术社区  · 17 年前

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

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

    我能想到的唯一合理的验证替代方案是让属性的set访问器忽略无效值,并在以后过滤掉无效的反序列化对象。然而,我不喜欢这个选择——还有更合适的方法吗?

    2 回复  |  直到 17 年前
        1
  •  3
  •   Ants    17 年前

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

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

    如果删除或修改隐藏的数据,我确实对如何往返数据有一些担忧。

    (例如:我记得当我在连接到两台不同打印机的两台不同机器上处理文档时,我对旧版本的MS Publisher特别沮丧。每当我在一台机器上修改文件时,Publisher都会重新格式化文档,以针对连接到该机器的打印机。当我回到另一台机器进行实际打印时,Publisher会再次重新格式化,但边距不太合适,所以我需要再调整一些。)

        2
  •  0
  •   Factor Mystic    17 年前

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