2013-03-06 3 views
3

Im использует XmlSerializer для сериализации объектов, которые содержат свойство datetime.Ошибка даты сериализации XMLSerializer: недействительно AllXsd

Это serialises прекрасно со следующим примером результатов производства:

<GuestUserLinkItemActivity> 
<ActivityDateTime>2013-03-06T00:00:00+00:00</ActivityDateTime> 
<ActivityMessage>Invitation email sent to guest.</ActivityMessage> 
</GuestUserLinkItemActivity> 

Но тогда, когда я пытаюсь и deserialise, снова используя XmlSerializer, это я получаю следующую ошибку

Строка ' 2013-03-06T00: 00: 00 00:00 'не является допустимым значением AllXsd. xmlserializer Deserialize

Есть несколько сообщений, которые я нашел с похожими проблемами, но не обеспечил решение этого.

XmlSerializer: The string '' is not a valid AllXsd value

The string '3/18/09 10:16 PM' is not a valid AllXsd value

Это, скорее всего, чтобы сделать с датой, хранятся в формате, не ожидается, и от одной из статей не в формате, ожидаемом в спецификации XML. поэтому я ожидаю, что если вручную изменить сохраненную дату, я могу заставить ее десериализировать ее должным образом.

Как я могу правильно сохранить даты, используя XmlSerializer.

Смотрите биты копии и вставили код ниже:

public class GuestUserLinkItemActivity 
{ 
public DateTime ActivityDateTime { get; set; } 
    public string ActivityMessage { get; set; } 
} 

Serializer класс:

public static class Serializer 
{ 

    public static T DeSerialise<T>(string contentsToDesrialise) 
    { 
     if (string.IsNullOrEmpty(contentsToDesrialise)) 
      return default(T); 

     var xmlSer = new XmlSerializer(typeof(T)); 
     var stream = new MemoryStream(); 
     var sw = new StreamWriter(stream); 
     sw.Write(contentsToDesrialise); 
     sw.Flush(); 
     stream.Position = 0; 
     var obj = (T)xmlSer.Deserialize(stream); 
     sw.Close(); 
     stream.Close(); 
     return obj; 
    } 

    public static string Serialise<T>(T obectToSerialise) 
    { 
     var ms = new MemoryStream(); 
     var sr = new XmlSerializer(typeof(T)); 
     sr.Serialize(ms, obectToSerialise); 
     ms.Position = 0; 
     var sread = new StreamReader(ms); 
     var serialisedObjectString = sread.ReadToEnd(); 
     sread.Close(); 
     ms.Close(); 
     return serialisedObjectString; 
    } 
} 

Использование:

var guestHistoryList = new List<GuestUserLinkItemActivity>(); 
guestHistoryList.Add(new GuestUserLinkItemActivity(){ 
         ActivityDateTime = DateTime.Now, 
         ActivityMessage = "Invitation email sent to guest."} 
); 

var serialisedArray = Serializer.Serialise<GuestUserLinkItemActivity[]>(guestHistoryList.ToArray()); 
var deserialisedObject = Serializer.DeSerialise<GuestUserLinkItemActivity[]>(serialisedArray); 
+1

Укажите код класса (ов), который вы пытаетесь выполнить сериализацией/десериализацией –

+1

FYI, ваши потоки и объекты StreamReader должны быть в блоках 'using'. –

ответ

1

Вместо того, чтобы пытаться сериализации/десериализации массив, попробуйте с List<GuestUserLinkItemActivity> - это сработало для меня:

var serialisedArray = Serializer.Serialise<List<GuestUserLinkItemActivity>>(guestHistoryList); 
var deserialisedObject1 = Serializer.DeSerialise<List<GuestUserLinkItemActivity>>(serialisedArray); 
+0

Вы правы, по какой-то своеобразной причине сохранение этого списка, а не массива, похоже, дает ожидаемые результаты. Было бы интересно узнать, почему. – Kramer00