use*_*077 10 c# xml serialization xml-serialization xmlserializer
我有一个应该序列化和反序列化的类.
但是每次去血后我都需要调用一种同步参考的方法.
无论如何,我可以实现反序列化并使用传统的反序列化,但在常规反序列化后添加对我的方法的调用?
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反序列化之后,他都不想"手动"调用某些逻辑.所以不要这样做:
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)