Si está usando XmlSerializer
, XmlAttributeOverrides
es probablemente lo que necesita.
Actualización: He estado investigando las posibilidades de personalizar el formato de fecha y, por lo que puedo ver, no existen soluciones bonitas.
Una opción, como se ha mencionado por otros, es implementar IXmlSerializable
. Esto tiene el inconveniente de que usted es completamente responsable de (des) serializar todo el objeto (-graph).
Una segunda opción, con una lista bastante extensa de inconvenientes, es subclasificar la clase base (la mencionaste como una alternativa en tu publicación). Con bastante fontanería, conversiones desde y hacia el objeto original, y el uso de XmlAttributeOverrides
se podría construir algo como esto:
public class Test
{
public int Prop { get; set; }
public DateTime TheDate { get; set; }
}
public class SubTest : Test
{
private string _customizedDate;
public string CustomizedDate
{
get { return TheDate.ToString("yyyyMMdd"); }
set
{
_customizedDate = value;
TheDate = DateTime.ParseExact(_customizedDate, "yyyyMMdd", null);
}
}
public Test Convert()
{
return new Test() { Prop = this.Prop };
}
}
// Serialize
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributes = new XmlAttributes();
attributes.XmlIgnore = true;
overrides.Add(typeof(Test), "TheDate", attributes);
XmlSerializer xs = new XmlSerializer(typeof(SubTest), overrides);
SubTest t = new SubTest() { Prop = 10, TheDate = DateTime.Now, CustomizedDate="20120221" };
xs.Serialize(fs, t);
// Deserialize
XmlSerializer xs = new XmlSerializer(typeof(SubTest));
SubTest t = (SubTest)xs.Deserialize(fs);
Test test = t.Convert();
No es bonita, pero va a trabajar.
Tenga en cuenta que en este caso está (des) serializando objetos SubTest. Si el tipo exacto es importante, tampoco va a ser una opción.
Por cierto, estamos utilizando .NET 4.0 – Schiavini
Y el XmlSerializer – Schiavini