Я десериализирую xml, используя множество сериализуемых объектов.Я читал, что во избежание недопустимого значения AllXsd в DateTime, мне нужно создать вспомогательное свойство строки, которое будет обрабатывать ввод как строку и преобразовывать ее.т.е.
[XmlIgnore]
public DateTime? DateUpdated { get; set; }
[XmlElement("updateDate")]
public string DateUpdatedAsText
{
set
{
if (!string.IsNullOrWhiteSpace(value))
{
try
{
DateUpdated = DateTime.Parse(value, CultureInfo.InvariantCulture);
}
catch (Exception) { }
}
}
get
{
return DateUpdated.HasValue ? DateUpdated.Value.ToString("yyyy-MM-ddTHH:mm:ss") : null;
}
}
Это проверено и прекрасно работает.Однако ...
У меня есть более 100 сущностей, которые содержат поля DateTime, некоторые из них более одного, и это решение не очень практично.Я должен буду реализовать это во всех из них, и если я хочу что-то изменить в будущем, мне придется сделать это снова во всех из них.Как я могу объявить общий пользовательский адаптер для обработки всех типов DateTime.В Java я могу сделать это:
@XmlJavaTypeAdapter(CalendarXmlAdapter.class)
@Column(name = "updateDate")
private Calendar DateUpdated;
и в CalendarXmlAdapter.class указать маршалинг и демаршаллинг
Есть ли подобное решение для C # System.Xml.Serialization.XmlSerializer?
Заранее спасибо
РЕДАКТИРОВАНИЕ
РЕШЕНИЕ: Это комбинация комментария @dbc и ответа @ steve16351.Я использовал класс CustomDateTime (с некоторыми незначительными изменениями в ReadXml, но это не важно) и в объявлении поля SomeDate (которое осталось типом DateTime?) Я использовал его следующим образом:
[XmlElement(ElementName = "updateDate", IsNullable = true, Type = typeof(CustomDateTime))]
public DateTime? DateUpdated { get; set; }
Преобразование происходитгладко