c# – 覆盖XML反序列化以使用基本反序列化和添加功能
发布时间:2020-12-15 18:11:19 所属栏目:百科 来源:网络整理
导读:我有一个类应该被序列化和反序列化. 但是每次卸载后,我需要调用一个同步引用的方法. 无论如何,我可以实现反序列化和使用传统的反序列化,但是在定期反序列化之后增加对我的方法的调用? 解决方法 using System.Xml.Serialization;namespace Custom.Xml.Serial
|
我有一个类应该被序列化和反序列化.
但是每次卸载后,我需要调用一个同步引用的方法. 无论如何,我可以实现反序列化和使用传统的反序列化,但是在定期反序列化之后增加对我的方法的调用? 解决方法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
// ...
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
