Как настроить XmlSerializer для сериализации экземпляра DateTime с использованием определенного шаблона даты и времени? - PullRequest
0 голосов
/ 25 сентября 2011

У меня есть много типов, которые (де) сериализуются с использованием XmlSerializer.Моя проблема в том, что я хочу, чтобы временные метки (DateTime экземпляры), появляющиеся в этих типах, были сериализованы в соответствующие строки с использованием определенного шаблона даты и времени.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 25 сентября 2011

Вы не можете сделать это с DateTime. В XSD есть определенный тип для дат , определяющий определенный формат. Вы будете нарушать спецификации, если вы это сделаете. Если вы хотите обрабатывать какой-либо пользовательский формат, используйте строки как свойства сериализуемого объекта, а не даты, и форматируйте эти строки так, как вам нравится.

2 голосов
/ 25 сентября 2011

Я бы предпочел пойти по маршруту Automapper - создать параллельный класс со строковыми свойствами только для сериализации, сопоставить его где-нибудь с

Mapper.CreateMap<DateTime, string>().ConvertUsing<DateTimeStringTypeConverter>();

и сделать конвертер

public class DateTimeStringTypeConverter : ITypeConverter<DateTime, string>
{
    public string Convert(ResolutionContext context)
    {
        if (context.IsSourceValueNull)
            return null;
        else
        {
            var source = (DateTime)context.SourceValue;
            return source.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
        }
    }
}

, а затем выполнитькарта -

Mapper.Map<DateStringClass>(DateClass);

Это больше работы, но держит домен в чистоте ...

2 голосов
/ 25 сентября 2011

Если есть конкретные требования для достижения такой цели, вы можете попробовать что-то вроде этого:

        private DateTime actualDateObject;

    public string FormattedDate
    {
        get 
        {
            return actualDateObject.ToString("format");
        }

        set
        {
            DateTime.TryParse(value, out actualDateObject);
        }

    }
...