Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化列表错误_C#_Xml_Exception Handling_Xml Serialization_Deserialization - Fatal编程技术网

C# 反序列化列表错误

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)

我有一个XML,内容是

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