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.
кредитов до Как узнать, когда вы были загружены с помощью XML-сериализации?
UPDATE:
ну, насколько я понимаю автор темы, он не хочет "вручную" вызывать какую-то логику после каждой десериализации 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
// ...
}
}