为什么OnDeserialization不会触发XML反序列化?

我有一个问题,我一直在抨击我的头三个小时的大部分时间。 我几乎可以肯定我错过了一些令人目眩的事情……

我有一个简单的XML文件:

       

我有一个简单的类结构:

 [Serializable] public class Record { [XmlAttribute("actual")] public double weight { get; set; } [XmlAttribute("date")] public DateTime date { get; set; } [XmlIgnore] public double trend { get; set; } } [Serializable] [XmlRoot("WeightStore")] public class SimpleWeightStore { [XmlArrayAttribute("Records")] private List records = new List(); public List Records { get { return records; } } [OnDeserialized()] public void OnDeserialized_Method(StreamingContext context) { // This code never gets called Console.WriteLine("OnDeserialized"); } } 

我在调用代码和类文件中使用它们:

 using System.Xml.Serialization; using System.Runtime.Serialization; 

我有一些调用代码:

 SimpleWeightStore weight_store_reload = new SimpleWeightStore(); TextReader reader = new StringReader(xml); XmlSerializer deserializer = new XmlSerializer(weight_store.GetType()); weight_store_reload = (SimpleWeightStore)deserializer.Deserialize(reader); 

问题是我希望OnDeserialized_Method被调用,而事实并非如此。

我怀疑它可能与XML反序列化而不是运行时反序列化这一事实有关,也许我使用了错误的属性名称,但我无法找出它可能是什么。

任何想法,伙计们?

对于XML反序列化,没有等效的OnDeserialized

请参阅此文章了解变通方法: 如何通过XML序列化了解何时加载?

你能以优雅的方式做到这一点的唯一方法是手动实现IXmlSerializable ,这并不好玩。 只是; XmlSerializer不支持序列化回调。

但有时,您可以切换到DataContractSerializer ,它仍然提供xmlfunction但支持序列化回调。 不幸的是,xml选项是有限的 – 它不适用于你的xml结构,因为它使用属性( DataContractSerializer只支持元素)。

您还可以查看此答案的评论,其中讨论了这一点。