【问题标题】:Data Contract Serialization Not Working For All Elements数据合同序列化不适用于所有元素
【发布时间】:2025-12-26 17:35:11
【问题描述】:

我有一个要序列化为对象的 XML 文件。一些元素被忽略了。

我的 XML 文件:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain">
<Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
<Url>http://www.gmail.com</Url> 
<ValidKey>true</ValidKey> 
<CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
<RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
<ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
</License>

我的班级定义:

[DataContract]
public class License
{
    [DataMember]
    public virtual int Id { get; set; }
    [DataMember]
    public virtual string Guid { get; set; }
    [DataMember]
    public virtual string ValidKey { get; set; }
    [DataMember]
    public virtual string Url { get; set; }
    [DataMember]
    public virtual string CurrentDate { get; set; }
    [DataMember]
    public virtual string RegistrationDate { get; set; }
    [DataMember]
    public virtual string ExpirationDate { get; set; }
}

还有我的序列化尝试:

XmlDocument Xmldoc = new XmlDocument();
Xmldoc.Load(string.Format(url));

string xml = Xmldoc.InnerXml;
var serializer = new DataContractSerializer(typeof(License));
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
License license = (License)serializer.ReadObject(memoryStream);
memoryStream.Close();

以下元素被序列化:

  • 指南
  • 有效密钥

以下元素未序列化:

  • 网址
  • 当前日期
  • 注册日期
  • 有效期

用“blah”替换 xml 文件中的字符串日期也不起作用。什么给了?

【问题讨论】:

  • 顺便说一句,反序列化 XmlDoc.CreateNavigator().ReadSubtree() 可能会更快。这将在您的文档上返回一个 XmlReader。
  • 谢谢约翰,我会检查的!

标签: c# xml serialization datacontractserializer


【解决方案1】:

DataContractSerializer 要求表示属性的 XML 元素按字母顺序排列。所以,你的 XML 应该是:

<?xml version="1.0" encoding="utf-8" ?> 
<License xmlns="http://schemas.datacontract.org/2004/07/MyApp.Domain">
    <CurrentDate>3/1/2010 9:39:28 PM</CurrentDate> 
    <ExpirationDate>3/8/2099 9:39:28 PM</ExpirationDate> 
    <Guid>7FF07F74-CD5F-4369-8FC7-9BF50274A8E8</Guid> 
    <RegistrationDate>3/8/2010 9:39:28 PM</RegistrationDate> 
    <Url>http://www.gmail.com</Url> 
    <ValidKey>true</ValidKey> 
</License>

John 指出,例外情况是您在 DataMember 属性上使用 Order 属性。在这种情况下,XML 元素必须按指定的顺序排列。

【讨论】:

  • @Aaron:感谢您提到字母顺序。我不知道。我建议您将Order 属性的使用添加到您的答案中。
  • 嗨,约翰 - 为了回答您最初的问题,我尝试重新排列它们。我使用了 Aaron 的解决方案,还添加了 Order 属性来帮助保护某人的编辑在将来无意中破坏它。谢谢你们俩