覆盖XML反序列化以使用基本反序列化和添加功能

use*_*077 10 c# xml serialization xml-serialization xmlserializer

我有一个应该序列化和反序列化的类.

但是每次去血后我都需要调用一种同步参考的方法.

无论如何,我可以实现反序列化并使用传统的反序列化,但在常规反序列化后添加对我的方法的调用?

avs*_*099 8

using System.Xml.Serialization;

namespace Custom.Xml.Serialization
{
    public interface IXmlDeserializationCallback
    {
        void OnXmlDeserialization(object sender);
    }

    public class CustomXmlSerializer : XmlSerializer
    {
        protected override object Deserialize(XmlSerializationReader reader)
        {
            var result = base.Deserialize(reader);

            var deserializedCallback = result as IXmlDeserializationCallback;
            if (deserializedCallback != null)
            {
                deserializedCallback.OnXmlDeserialization(this);
            }

            return result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从IXmlDeserializationCallback继承您的类,并在OnXmlDeserialization方法中实现您的同步逻辑.

学分如何通过XML序列化加载?

更新:

好吧,据我所知,在每次XML反序列化之后,他都不想"手动"调用某些逻辑.所以不要这样做:

public class MyEntity
{
     public string SomeData { get; set; }

     public void FixReferences()
     {
          // call after deserialization
          // ...
     }
}

foreach (var xmlData in xmlArray)
{
    var xmlSer = new XmlSerializer(typeof(MyEntity));
    using (var memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData)))
    {
       var entity = (MyEntity)xmlSer.Deserialize(memStream);
       entity.FixReferences();

       // do something else with the entity
       // ...  
    }
}
Run Code Online (Sandbox Code Playgroud)

他想做反序列化,而不用担心额外的电话.在这种情况下,建议的解决方案是最干净/最简单的 - 您只需要从IXmlDeserializationCallback接口继承您的实体类,并用CustomXmlSerializer替换XmlSerializer:

 public class MyEntity: IXmlDeserializationCallback
    {
         public string SomeData { get; set; }

         private void FixReferences()
         {
              // call after deserialization
              // ...
         }

         public void OnXmlDeserialization(object sender)
         {
             FixReferences();
         } 
    }

    foreach (var xmlData in xmlArray)
    {
        var xmlSer = new CustomXmlSerializer(typeof(MyEntity));
        using (var memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData)))
        {
           var entity = (MyEntity)xmlSer.Deserialize(memStream);
           // entity.FixReferences(); - will be called automatically

           // do something else with the entity
           // ...  
        }
    }
Run Code Online (Sandbox Code Playgroud)