Если вы используете XmlSerializer
, XmlAttributeOverrides
, вероятно, то, что вам нужно.
Обновление:
Я изучал возможности настройки формата даты, и, насколько я могу судить, симпатичных решений не существует.
Один вариант, как уже упоминалось другими, заключается в реализации IXmlSerializable
. Это имеет тот недостаток, что вы полностью ответственны за (де) сериализацию всего объекта (-граф).
Второй вариант, также с довольно обширным списком недостатков, заключается в создании подкласса базового класса (вы упомянули его как альтернативу в своем посте). С некоторой долей сантехники, преобразованиями из исходного объекта и в него и использованием XmlAttributeOverrides
вы можете построить что-то вроде этого:
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();
Это не красиво, но это будет работать.
Обратите внимание, что в этом случае вы (де) сериализуете объекты SubTest. Если точный тип важен, это тоже не вариант.