Как правильно сериализовать DateTime? - PullRequest
4 голосов
/ 13 июня 2011

Когда я сериализирую в XML свое поле DateTime (которое имеет значение из средства выбора даты), дата всегда сериализуется как

0001-01-01T00: 00: 00

т.е. 1 января 1AD.Почему это?Кроме того, когда я пытаюсь десериализовать XML, я получаю эту ошибку:

startIndex не может быть больше длины строки.
Имя параметра: startIndex.

Однако, когда я вручную редактирую XML, десериализация проходит отлично для годов 1000-9999, но не для лет <1000? </p>

Свойство DateTime имеет [XmlElement] , как и все остальные поля, которые сериализованы правильно, а остальная часть кода выглядит нормально.Заранее спасибо!

1 Ответ

6 голосов
/ 13 июня 2011

Если вы хотите легко сериализовать его (и освоить его сериализацию), используйте поле прокси.

[Serializable]
public class Foo
{
    // Used for current use
    [XmlIgnore]
    public DateTime Date { get; set; }

    // For serialization.
    [XmlElement]
    public String ProxyDate
    {
        get { return Date.ToString("<wanted format>"); }
        set { Date = DateTime.Parse(value); }
    }
}

Редактировать

Следующий код:

[Serializable]
public class TestDate
{
    [XmlIgnore]
    public DateTime Date { get; set; }

    [XmlElement]
    public String ProxyDate
    {
        get { return Date.ToString("D"); }
        set { Date = DateTime.Parse(value); }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        TestDate date = new TestDate()
        {
            Date = DateTime.Now
        };

        XmlSerializer serializer = new XmlSerializer(typeof(TestDate));
        serializer.Serialize(Console.Out, date);
    }
}

выдает следующий вывод:

<?xml version="1.0" encoding="ibm850"?>
<TestDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:
//www.w3.org/2001/XMLSchema">
  <ProxyDate>mardi 14 juin 2011</ProxyDate>
</TestDate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...