Что означает ошибка: «Строка не была распознана как действительный DateTime» во время десериализации? - PullRequest
0 голосов
/ 09 февраля 2009
[XmlElement(ElementName = ElementConstants.CreateDate, 
    Namespace = "http://api.facebook.com/1.0/",
    DataType = "date", Type = typeof(DateTime))]
public DateTime CreateDate { get; set; }

И если я попытаюсь извлечь DataType из атрибута, я получу: {"Строка '1233469624' не является допустимым значением AllXsd."}

Вот пример одного из значений узла:

<created>1230437805</created>

Я не уверен, как настроить здесь свойство DateTime для успешной десериализации.

Ответы [ 2 ]

10 голосов
/ 09 февраля 2009

Я уже ответил вам за это несколько дней назад .

В вашем классе вам нужно сделать перевод:

static readonly DateTime epoch = new DateTime(1970, 1, 1);
static long SerializeDateTime(DateTime value)
{
    return (long)((value - epoch).TotalSeconds);
}
static DateTime DeserializeDateTime(long value)
{
    return epoch.AddSeconds(value);
}

[XmlIgnore]
public DateTime CreateDate { get; set; }

[XmlElement("created"), Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public long CreateDateInt64 {
    get {return SerializeDateTime(CreateDate);}
    set {CreateDate = DeserializeDateTime(value);}
}

и т.д.. CreateDateInt64 - это версия, которую использует XmlSerializer, но при вызове она выполняет перевод и передает значение в CreateDate (что игнорируется XmlSerializer из-за атрибута).

Это означает, что у вас есть DateTime CreateDate в классе и число в xml.

5 голосов
/ 09 февраля 2009

Для меня это выглядит как метка времени в формате unix. Тип данных «XML» в формате XML очень явно указан в следующем формате:

гггг-мм-ддтчч: мм: сс.фффффф + смещение часового пояса

Например: 2009-02-09T10:01:23.3212345+06:00

...