Estoy tratando de cargar un árbol de objetos a través de la serialización de XML, y en este momento cargará los objetos y creará el árbol muy felizmente. Mi problema gira en torno al hecho de que estas clases admiten un nivel de auditoría. Lo que me gustaría hacer es llamar a algún método en cada objeto una vez que se haya cargado.¿Cómo se puede saber cuándo se ha cargado mediante serialización XML?
Por el bien del argumento, supongamos que tengo un árbol de objetos bastante genérico con diferentes clases en diferentes niveles, como:
<Customer name="Foo Bar Inc.">
<Office IsHq="True">
<Street>123 Any Street</Street>
<Town name="Anytown">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
<Office IsHq="False">
<Street>456 High Street</Street>
<Town name="Anycity">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
</Customer>
¿Hay alguna manera el uso de los serializadores por defecto (de forma similar que pueda crear métodos como ShouldSerializeFoo
) para determinar cuándo se ha completado la carga de cada objeto?
Editar: Debo señalar que el caso evidente de la exposición de algo parecido a un método OnLoaded()
que podía llamada después deserialising, me llama la atención por ser una "mala cosa que hacer".
Edit2: Por el bien de la discusión esta es mi actual
piratear
"enfoque", que trabaja para el nivel básico, pero el nodo Ciudad hijo todavía piensa que necesita ser salvado con los cambios (en lo real mundo el modelo de objetos es mucho más complejo, pero esto será al menos compilar, sin necesidad de fuente completo)
public class Office
{
[XmlAttribute("IsHq")]
public bool IsHeadquarters { get; set; }
[XmlElement]
public string Street { get; set; }
[XmlElement]
public Town Town { get; set; }
protected virtual void OnLoaded() {}
public static OfficeCollection Search()
{
OfficeCollection retval = new OfficeCollection();
string xmlString = @"
<Office IsHq='True'>
<Street>123 Any Street</Street>
<Town name='Anytown'>
<State name='Anystate'>
<Country name='My Country' />
</State>
</Town>
</Office>";
XmlSerializer xs = new XmlSerializer(retval.GetType());
XmlReader xr = new XmlTextReader(xmlString);
retval = (OfficeCollection)xs.Deserialize(xr);
foreach (Office thisOffice in retval)
{
thisOffice.OnLoaded();
}
return retval;
}
}
No es una respuesta real, pero ¿por qué no puede hacer la auditoría en la propiedad de acceso get? – weiqure
La auditoría está en el conjunto de propiedades, por lo que mantiene un registro interno de que se ha modificado desde que se cargó (y por lo tanto necesita guardarse, lo que significaría que todos los valores cambiaron de sus valores predeterminados a los valores reales cargados) –
Lo siento, quise escribir el set. – weiqure