0

如何反序列化“<MyType><StartDate>01/01/2000</StartDate></MyType>”

下面是 MyType 定义

[Serializable]
public class MyType
{
    DateTime _StartDate;
    public DateTime StartDate
    {
        set
        {
            _StartDate = value;
        }
        get
        {
            return _StartDate;
        }
    }
}

反序列化时出现以下错误

{“字符串 '01/01/2000' 不是有效的 AllXsd 值。”} [System.FormatException]:{“字符串 '01/01/2000' 不是有效的 AllXsd 值。”} 数据:{System .Collections.ListDictionaryInternal} HelpLink:null InnerException:null 消息:“字符串 '01/01/2000' 不是有效的 AllXsd 值。” 来源: "System.Xml" StackTrace: " at System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags 种)\r\n at System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)\r\ n 在 System.Xml.Serialization.XmlCustomFormatter.ToDateTime(字符串值)\r\n 在 System.Xml.Serialization.XmlSerializationReader.ToDateTime(字符串值)\r\n 在 Microsoft.Xml.Serialization.GeneratedAssembly。
在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMyType.Read3_MyType()" TargetSite: {Void .ctor(System.String, System.Xml.Schema.XsdDateTimeFlags)}

4

3 回答 3

2

如果您确实无法控制输入 XML 但仍然必须解析它(尽管不正确),那么我过去就做过类似的事情。

[Serializable]
public class MyType
{
    DateTime _StartDate;
    public string StartDate
    {
        set
        {
            _StartDate = DateTime.Parse(value);
        }
        get
        {
            return _StartDate.ToShortDateString();
        }
    }
}
于 2010-04-21T17:41:16.450 回答
1

可能 DateTime 反序列化器需要与您在那里的格式不同的格式。

我使用的格式如下所示:

2010-01-20T13:40

(这是针对 UTC 日期时间的,您也可以在字符串末尾添加时区)

我使用这种格式发送到 [DataMember] 属性,DataContractSerializer 可以很好地处理它,所以我想它也可以与 Xml 序列化一起使用。

有一个关于您在这里遇到的错误的线程,看起来它可能会有所帮助。

于 2010-04-21T16:15:06.743 回答
0

简而言之,我认为你没有。您的问题是XmlSerializer尝试解析01/01/2000为一个DateTime值,但01/01/2000不是有效的 XML date

XML 字符串是如何创建的?您可以控制该代码吗?如果是,使用该XmlConvert.ToString(DateTime)方法获取符合标准的字符串。

于 2010-04-21T16:14:38.317 回答