4

私はXMLを持っていて、内容は

<Contracts>
    <Contract EntryType="U" ID="401" GroupCode="1">
    </Contract>
</Contracts>

契約のリストがあるクラスがあります

[XmlArray("Contracts")]
[XmlArrayItem("Contract", typeof(Contract))]
public List<Contract> Contracts { get; set; }

したがって、これを逆シリアル化しようとすると、次のエラーが発生します。

「プロパティ「契約」を反映するエラーがありました。」

デシリアライズコード:

XmlSerializer reader = new XmlSerializer(typeof(ContractPosting));
xml.Position = 0;
eContractXML = (Contract)reader.Deserialize(xml);

クラスは次のとおりです。

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

3 に答える 3

3

null許容型を属性としてシリアル化することはできません。

ContractXML属性に使用しないようにクラスを変更するか、Nullableこれらのプロパティを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; } 
}

また:

public class Contract { 
  public int? ContractID { get; set; } 

  [XmlAttribute(AttributeName= "PostingID")] 
  public string PostingID { get; set; } 

  public System.Nullable<EntryTypeOptions> EntryType { get; set; } 
}
于 2013-01-23T19:27:15.873 に答える
0

ルートノードは<Contracts>であるため、クラスを次のように再配置してみてください。

[XmlRoot("Contracts")]
public class ContractPosting {
    [XmlElement("Contract", typeof(Contract))]
    public List<Contract> Contracts { get; set; }
}

XmlArrayとを使用する場合XmlArrayItem、両方を何かの中にネストする必要があります。ただし、現在のXmlArrayタグは実際にはXMLファイルのルートノードであるため、である必要がありますXmlRoot

デモ: http: //ideone.com/jBSwGx

于 2013-01-23T19:07:01.620 に答える
0

おかげで、問題はNullable型であり、私はこの方法で解決しました

[XmlIgnore]
public System.Nullable<int> ContractID { get; set; }


[XmlAttribute("ContractID")]
public int ContractIDxml {
get { return ContractID ?? 00; }
set { ContractID = value; }
}
于 2013-01-24T13:34:37.607 に答える