我有一个类应该被序列化和反序列化.
但是每次卸载后,我需要调用一个同步引用的方法.
无论如何,我可以实现反序列化和使用传统的反序列化,但是在定期反序列化之后增加对我的方法的调用?
解决方法
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; } } }
从IXmlDeserializationCallback继承你的类,并在OnXmlDeserialization方法中实现你的同步逻辑.
学分到How do you find out when you’ve been loaded via XML Serialization?
更新:
那么就我所了解的topicstarter来说,他并不想在每次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 // ... } }
他想做的只是反序列化,而不用担心额外的电话.在这种情况下,提出的解决方案是最干净/最简单的 – 您只需要从IXmlDeserializationCallback接口继承您的实体类,并将XmlSerializer替换为CustomXmlSerializer:
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 // ... } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。