2013-03-06 127 views
3

使用XmlSerializer来串行化包含datetime属性的对象。XMLSerializer串行化日期错误:不是有效的AllXsd

这串行化精细与下面产生的结果的一个例子:

<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反序列化

有几个帖子我发现有类似的问题,但没有提供解决方案。

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; } 
} 

串行类:

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

请发布您想要序列化/反序列化的类的代码 – 2013-03-06 16:38:04

+1

仅供参考,您的流和StreamReader对象应该位于'using'块中。 – 2013-03-06 17:57:50

回答

1

而不是试图序列化/反序列化的数组,尝试与List<GuestUserLinkItemActivity> - 它为我工作:

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

你是对的,因为一些特殊的原因,保存这个是一个列表,而不是一个数组,似乎产生了预期的结果。有兴趣知道为什么。 – Kramer00 2013-03-11 11:55:06

相关问题