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;
}
}
}
ereditano la classe da IXmlDeserializationCallback e implementare la logica di sincronizzazione nella OnXmlDeserialization metodo.
crediti a How do you find out when you've been loaded via XML Serialization?
UPDATE:
bene, per quanto ho capito il topicstarter, lui non vuole "manualmente" chiamare una logica dopo ogni deserializzazione XML. Quindi, invece di fare questo:
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
// ...
}
}
lui vuole fare solo la deserializzazione, senza preoccuparsi di chiamate extra. In questo caso, la soluzione proposta è il più pulito/più semplice - è sufficiente per ereditare la classe entità dall'interfaccia IXmlDeserializationCallback, e sostituirlo con 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
// ...
}
}
Può chiarire che cosa esattamente si intende per "I neeed per chiamare un mthod di sincronizzare i riferimenti"? Per favore, spiega _why_ anche questo è necessario. – Oded
per esempio la classe include: membro A, membroB e un elenco di membri che ha xmlIgnore e dovrebbe contian il membro A e B la desrializzazione regolare creerà diverse istanze per la lista e il membro ho bisogno della lista per fare riferimento ai membri che sono stati deserizzati . la domanda su come creare un metodo di post-desrializzazione? o implementare e chiamare la deserializzazione normale – user271077
Puoi fornire un esempio? Non è ancora chiaro cosa stai cercando di realizzare. Stai cercando di popolare altri campi membri con 'XmlIgnore' su un oggetto dopo ogni deserializzazione? – mellamokb