6

次のxmlをデシリアライズしたい:

<Root>
    <Order> 
        <Id>12</Id>
        <Date>2013-03-28T16:12:45</Date>
        <Number></Number>
        <Amount></Amount>
    </Order>
</Root>

私のクラスはこれに似ています:

    [XmlType("Order")]
    public class ImportOrder
    {
        [XmlElement("Id")]
        public int OrderId { get; set; }

        [XmlElement("Date")]
        public DateTime OrderDate { get; set; }

        [XmlElement("Number")]
        public string OrderNumber { get; set; }   

        [XmlElement("Amount", IsNullable = true)]
        public decimal? OrderAmount { get; set; }
    }

私が使用するデシリアライザー:

        public List<T> DeserializeList<T>(string filePath, string rootName)
        {
            var itemList = new List<T>();

            if (File.Exists(filePath))
            {
                var serializer = new XmlSerializer(typeof(List<T>), new XmlRootAttribute(rootName));
                TextReader reader = new StreamReader(filePath);
                itemList = (List<T>)serializer.Deserialize(reader);
                reader.Close();
            }

            return itemList;
        }

すべてのデータがxmlに入力されている場合、正常に機能します。がNumber空でもOKです。しかし、Amount空の場合は例外が発生します:

Input string was not in a correct format.

これは、null 許容型を単純に逆シリアル化できないためです。この問題を解決するために、インターネットで複数の解決策を見つけました。しかし、見栄えがよくないので、多くのコードを書かなければなりません。

エレガントなソリューションはありますか?null 許容型を逆シリアル化するためのベスト プラクティスは何ですか?

4

1 に答える 1

0

そこにある特定の方法で XML を保持する特定の必要性はありますか?

要素 Amount が null 可能であることを XML デシリアライザーに既に伝えている場合、これは要素が存在するかどうかを意味するため、これを求めています。したがって、XML を生成する場合は、この要素の生成を回避するだけで済み、準備は完了です。

次のようなファイルがある場合に確認できます。

<Root>
    <Order> 
        <Id>12</Id>
        <Date>2013-03-28T16:12:45</Date>
        <Number></Number>
    </Order>
</Root>

そして、コードでそれを解析すると機能します。

于 2013-03-28T22:38:04.717 に答える