【问题标题】:XMLSerializer serialising date error : Is not a valid AllXsdXMLSerializer 序列化日期错误:不是有效的 AllXsd
【发布时间】:2013-03-06 15:38:00
【问题描述】:

我使用XmlSerializer 来序列化包含日期时间属性的对象。

这个序列化很好,下面是一个产生结果的例子:

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

但是当我尝试反序列化时,再次使用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);

【问题讨论】:

  • 请发布您尝试序列化/反序列化的类的代码
  • 仅供参考,您的流和 StreamReader 对象应位于 using 块中。

标签: c# .net xml-serialization xmlserializer


【解决方案1】:

不要尝试序列化/反序列化数组,而是尝试使用List&lt;GuestUserLinkItemActivity&gt; - 它对我有用:

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

【讨论】:

  • 你是对的,出于某种特殊原因,保存这是一个列表,而不是一个数组,似乎会产生预期的结果。很想知道为什么。
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 2017-11-07
  • 2012-05-25
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多