2009-02-08 81 views
2

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

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

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

回答

3

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

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

我有关于你将如何去圆跳闸的数据,如果你在幕后删除或修改数据的担忧。 (例如:我记得老版本的MS Publisher特别沮丧,因为我在两台不同的机器上处理一个文档,这两台机器连接到两台不同的打印机上,每当我在一台机器上修改文件时,Publisher会重新格式化该文件的目标打印机连接到该机器当我回到另一台机器,我打算做的实际打印,出版商将重新格式化,但利润率将不太正确,所以我需要调整更多)

+0

我想那样可以。我仍然不喜欢这个无效项目仍然被创建的想法,但我想我可以在这种情况下接受它。 Re:数据可移植性,目前,我不会担心在多台机器上使用序列化文件。也许以后。 – 2009-02-08 21:06:22

0

您也可以为您的类实现IXmlSerializable,其中包括您自己的实现ReadXml,允许您在对象被反序列化时执行任何验证。

+0

虽然有效,但对于XmlSerializer(不执行回调)来说,这是很多额外的工作,这是唯一的方法,但对于DataContractSerializer,回调路由更为可取。 – 2009-02-08 18:18:48