0

データ オブジェクトの階層を手動で逆シリアル化しようとしています (完全なコードは下にあります) が、理解できない例外が発生します。

  • DEMDataSetオブジェクトのコレクションが含まれていDemographicReportGroupます。
  • DemographicReportGroupを実装しIXmlSerializable、オブジェクトを含みAgencyます。
  • Agencyobject にはリーフ データ項目dAgency.01、別名が含まれますEMSAgencyUniqueStateID

ReadXmlのメソッドの実装DemographicReportGroupに取り​​組んでいますが、次のように例外がスローされます。

#region ReadXml
public void ReadXml(System.Xml.XmlReader xmlReader)
{
    xmlReader.MoveToContent();
    this.timeStamp = DateTime.Parse(xmlReader.GetAttribute("timeStamp"));
    if (xmlReader.IsEmptyElement) return;
    xmlReader.ReadStartElement();
    if (xmlReader.Name == "dAgency") 
    { 
        xmlReader.ReadStartElement("dAgency");
        // **Exception here: System.InvalidOperationException**
        this.Agency = new XmlSerializer(typeof(Agency)).Deserialize(xmlReader) as Agency; 
        xmlReader.ReadEndElement(); 
    }
    xmlReader.ReadEndElement();
}
#endregion

System.InvalidOperationException: <dAgency.01 xmlns=' http://www.nemsis.org '> は予期されていませんでした。

これまでに見つけたすべてのコード サンプルは、これが機能することを示しています...おそらく、XML 属性の設定ミスでしょうか?

うまくいけば、誰かが助けてくれるでしょう!

また、興味がある場合は:

  • なぜあなたIXmlSerializableはまったく実装していますか?
    • timeStampプロパティは日付/時刻です。プレーンの場合DateTime、シリアル化されると常に値 (1/1/0001) になります。タイプはDateTime?、値がないことを知らせてくれますが、属性としてシリアル化することはできません。この例が含まれているデータ標準では、タイム スタンプが属性である必要があります。
  • ShouldSerializetimeStampValue の実装についてはどうでしょうか。
    • これにより、余分なプロパティとメソッド (timeStampValue と ShouldSerializetimeStampValue) が作成され、1 つのデータ項目に対してコードが多すぎます。また、私が扱っているタイムスタンプはこれだけではありません。

完全なコード (Visual Studio の単体テストとして):

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;  // System.Xml.dll.
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Tests.Xml
{
    [TestClass]
    public class TestIXmlSerializable
    {
        [TestMethod]
        public void DeserializeChildElement()
        {
            var xml = @"<DEMDataSet xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""http://www.nemsis.org http://nemsis.org/media/XSD_v3/_nemsis_v3.3.1/3.3.1.130201/XSDs/NEMSIS_XSDs_v3.3.1.130201/DEMDataSet_v3.xsd""  xmlns=""http://www.nemsis.org"">
    <DemographicReport timeStamp=""1969-03-14T07:38:20+07:00"">
        <dAgency>
            <dAgency.01>M</dAgency.01>
        </dAgency>
    </DemographicReport>
</DEMDataSet>";

            var xmlSerializer = new XmlSerializer(typeof(DEMDataSet));

            DEMDataSet demDataSet = null;

            using (var streamReader = new StringReader(xml))
                demDataSet = xmlSerializer.Deserialize(streamReader) as DEMDataSet;

        }
    }

    [Serializable]
    /// <summary>Root Tag For Demographic DataSet</summary>
    [XmlType(AnonymousType = true, Namespace = "http://www.nemsis.org")]
    [XmlRoot(Namespace = "http://www.nemsis.org", IsNullable = false)]
    public partial class DEMDataSet
    {
        #region DemographicReportGroup
        private List<DemographicReportGroup> _demographicReportGroup;

        /// <summary>Container Tag to hold each instance of a demographic record</summary>
        [XmlElement("DemographicReport")]
        public List<DemographicReportGroup> DemographicReportGroup
        {
            get
            {
                return this._demographicReportGroup;
            }
            set
            {
                this._demographicReportGroup = value;
            }
        }
        #endregion

    }

    [Serializable]
    public partial class DemographicReportGroup : IXmlSerializable
    {
        #region Agency
        private Agency _agency;

        /// <summary></summary>
        [XmlElement("dAgency", IsNullable = false)]
        public Agency Agency
        {
            get
            {
                return this._agency;
            }
            set
            {
                this._agency = value;
            }
        }
        #endregion

        #region timeStamp
        private DateTime? _timeStamp;

        /// <summary></summary>
        [XmlAttribute]
        public DateTime? timeStamp
        {
            get
            {
                return this._timeStamp;
            }
            set
            {
                this._timeStamp = value;
            }
        }
        #endregion

        #region GetSchema
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
        #endregion

        #region ReadXml
        public void ReadXml(System.Xml.XmlReader xmlReader)
        {
            xmlReader.MoveToContent();
            this.timeStamp = DateTime.Parse(xmlReader.GetAttribute("timeStamp"));
            if (xmlReader.IsEmptyElement) return;
            xmlReader.ReadStartElement();
            if (xmlReader.Name == "dAgency") { xmlReader.ReadStartElement("dAgency"); this.Agency = new XmlSerializer(typeof(Agency)).Deserialize(xmlReader) as Agency; xmlReader.ReadEndElement(); }
            xmlReader.ReadEndElement();
        }
        #endregion

        #region WriteXml
        public void WriteXml(System.Xml.XmlWriter xmlWriter)
        {
            if (this.timeStamp.HasValue) xmlWriter.WriteAttributeString("timeStamp", this.timeStamp.Value.ToString("o"));
            if (this.Agency != null) { xmlWriter.WriteStartElement("dAgency"); new XmlSerializer(typeof(Agency)); xmlWriter.WriteEndElement(); }
        }
        #endregion
    }

    [Serializable]
    /// <summary></summary>
    [XmlType(Namespace = "http://www.nemsis.org")]
    [XmlRoot(Namespace = "http://www.nemsis.org", IsNullable = true)]
    public partial class Agency
    {
        #region EMSAgencyUniqueStateID
        private string _emsAgencyUniqueStateID;

        /// <summary>The unique ID assigned to the EMS Agency which is associated with all state licensure numbers and information.</summary>
        [XmlElement("dAgency.01")]
        public string EMSAgencyUniqueStateID
        {
            get
            {
                return this._emsAgencyUniqueStateID;
            }
            set
            {
                this._emsAgencyUniqueStateID = value;
            }
        }
        #endregion
    }
}
4

1 に答える 1