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;
}
}
}
dziedziczy swoją klasę od IXmlDeserializationCallback i implementuje logikę synchronizacji w metodzie OnXmlDeserialization.
kredyty do How do you find out when you've been loaded via XML Serialization?
UPDATE:
dobrze, o ile mi zrozumieć topicstarter, on nie chce się "ręcznie" nazywamy jakąś logikę po każdym deserializacji XML. Zamiast tego:
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
// ...
}
}
chce zrobić tylko deserializację, nie martwiąc się o dodatkowe połączenia. W tym przypadku, proponowane rozwiązanie jest najczystszym/najprostszy - trzeba tylko dziedziczą swoją klasę podmiot z interfejsem IXmlDeserializationCallback i zastąpić XmlSerializer z 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
// ...
}
}
Czy możesz wyjaśnić, co dokładnie masz na myśli przez "Czy mogę nazwać podłoże synchronizacji odniesień"? Proszę wyjaśnić, dlaczego tak jest również potrzebne. – Oded
na przykład klasa zawiera: element A, element członkowski i listę członków, która ma xmlIgnore i powinna contian członek A i B regularne desrializacje będą tworzyć różne instancje dla listy i członek, którego potrzebuję na liście, aby odwołać się do członków, które zostały zhakłowane . pytanie, jak stworzyć metodę deskrypcji postów? lub zaimplementować i wywołać regularną deserializację – user271077
Czy możesz podać przykład? Wciąż nie jest jasne, co próbujesz osiągnąć. Chcesz wymieniać inne pola elementu z 'XmlIgnore' na obiekcie po każdej deserializacji? – mellamokb