C# 反序列化列表错误
我有一个XML,内容是C# 反序列化列表错误,c#,xml,exception-handling,xml-serialization,deserialization,C#,Xml,Exception Handling,Xml Serialization,Deserialization,我有一个XML,内容是 <Contracts> <Contract EntryType="U" ID="401" GroupCode="1"> </Contract> </Contracts> 以下是课程: public partial class ContractPosting { [XmlArray("Contracts")] [XmlArrayItem("Contract", typeof(Contract)
<Contracts>
<Contract EntryType="U" ID="401" GroupCode="1">
</Contract>
</Contracts>
以下是课程:
public partial class ContractPosting
{
[XmlArray("Contracts")]
[XmlArrayItem("Contract", typeof(Contract))]
public List<Contract> Contracts { get; set; }
}
public class Contract
{
[XmlAttribute(AttributeName = "ContractID")]
public System.Nullable<int> ContractID { get; set; }
[XmlAttribute(AttributeName= "PostingID")]
public string PostingID { get; set; }
public EntryTypeOptions? EntryType { get; set; }
}
公共部分类发布
{
[XmlArray(“合同”)]
[XmlArrayItem(“合同”,类型(合同))]
公共列表契约{get;set;}
}
公共类合同
{
[xmltattribute(AttributeName=“contracted”)]
public System.null可收缩{get;set;}
[XmlAttribute(AttributeName=“PostingID”)]
公共字符串PostingID{get;set;}
公共EntryTypeOptions?EntryType{get;set;}
}
由于根节点是
,请尝试将您的类重新安排为:
[XmlRoot("Contracts")]
public class ContractPosting {
[XmlElement("Contract", typeof(Contract))]
public List<Contract> Contracts { get; set; }
}
[XmlRoot(“合同”)]
公开课合约张贴{
[XmlElement(“合同”,类型(合同))]
公共列表契约{get;set;}
}
当您使用XmlArray
和XmlArrayItem
时,它们都必须嵌套在某个对象中。但是您当前的XmlArray
标记实际上是XML
文件的根节点,因此它需要是XmlRoot
演示:可空类型不能序列化为属性 您必须更改
Contract
类,使其不使用Nullable
作为XML属性,或者更改XML以将这些属性写入XML元素
试试这个:
public class Contract {
[XmlAttribute(AttributeName = "ContractID")]
public int ContractID { get; set; }
[XmlAttribute(AttributeName= "PostingID")]
public string PostingID { get; set; }
public System.Nullable<EntryTypeOptions> EntryType { get; set; }
}
公共类合同{
[xmltattribute(AttributeName=“contracted”)]
公共int压缩{get;set;}
[XmlAttribute(AttributeName=“PostingID”)]
公共字符串PostingID{get;set;}
public System.Nullable EntryType{get;set;}
}
或:
公共类合同{
公共int?压缩{get;set;}
[XmlAttribute(AttributeName=“PostingID”)]
公共字符串PostingID{get;set;}
public System.Nullable EntryType{get;set;}
}
谢谢,问题是可空类型,我用这种方法解决了
[XmlIgnore]
public System.Nullable<int> ContractID { get; set; }
[XmlAttribute("ContractID")]
public int ContractIDxml {
get { return ContractID ?? 00; }
set { ContractID = value; }
}
[XmlIgnore]
public System.null可收缩{get;set;}
[xmldattribute(“constractd”)]
公共整数压缩DXML{
获取{return construcd??00;}
设置{construcd=value;}
}
如果查看InnerException
,您将看到一条更详细的错误消息,解释它无法反序列化的原因。您可以粘贴类的定义吗?公共类契约{}…等等。您想要反序列化的类型是什么?您使用哪个序列化程序?公共部分类ContractPosting{[XmlArray(“Contracts”)][XmlArrayItem(“Contract”,typeof(Contract))]公共列表Contracts{get;set;}}公共类Contract{[xmltribute(AttributeName=“Contract”)]公共系统。可为空的压缩{get;set;}[xmltribute(AttributeName=“PostingID”)]公共字符串PostingID{get;set;}public System.Nullable EntryType{get;set;}}我测试了您的代码,当我深入到最底层的InnerException(4层深)时,发现了以下错误消息:无法序列化System.Nullable``1[System.Int32]类型的成员'Compracted'。XmlAttribute/XmlText不能用于编码复杂类型。
-这是将可空的更改为常规的int
,或将其转换为元素而不是属性的副本,然后应该可以工作-请参阅
public class Contract {
[XmlAttribute(AttributeName = "ContractID")]
public int ContractID { get; set; }
[XmlAttribute(AttributeName= "PostingID")]
public string PostingID { get; set; }
public System.Nullable<EntryTypeOptions> EntryType { get; set; }
}
public class Contract {
public int? ContractID { get; set; }
[XmlAttribute(AttributeName= "PostingID")]
public string PostingID { get; set; }
public System.Nullable<EntryTypeOptions> EntryType { get; set; }
}
[XmlIgnore]
public System.Nullable<int> ContractID { get; set; }
[XmlAttribute("ContractID")]
public int ContractIDxml {
get { return ContractID ?? 00; }
set { ContractID = value; }
}