序列化对象列表

Serialize list of objects

我需要 serialize/deserialize 一些 XML 代码,其中一部分看起来像下一个示例:

<CoordGeom>
    <Curve rot="cw" chord="830.754618036885" crvType="arc" delta="72.796763873948" dirEnd="283.177582669379" dirStart="355.974346543327" external="169.661846548051" length="889.38025007632" midOrd="136.562611151675" radius="699.999999998612" tangent="516.053996536113">
        <Start>4897794.2800513292 6491234.9390137056</Start>
        <Center>4897096.0071489429 6491185.7968343571</Center>
        <End>4897255.5861026254 6491867.3645547926</End>
        <PI>4897758.0514541129 6491749.7197593488</PI>
    </Curve>
    <Spiral length="109.418078418008" radiusEnd="INF" radiusStart="699.999999999025" rot="cw" spiType="clothoid" theta="4.477995782709" totalY="2.849307921907" totalX="109.351261203955" tanLong="72.968738862921" tanShort="36.493923980983">
        <Start>4897255.5861026254 6491867.3645547936</Start>
        <PI>4897220.0531303799 6491875.6840722272</PI>
        <End>4897147.9238984985 6491886.7208634559</End>
    </Spiral>
    <Spiral length="153.185309785019" radiusEnd="499.99999999993" radiusStart="INF" rot="ccw" spiType="clothoid" theta="8.776871734087" totalY="7.808812331497" totalX="152.826239431476" tanLong="102.249348442205" tanShort="51.176160975293">
        <Start>4897147.9238985004 6491886.7208634559</Start>
        <PI>4897046.8509311257 6491902.186455016</PI>
        <End>4896998.0370401107 6491917.5553683294</End>
    </Spiral>
    <Curve rot="ccw" chord="936.510896488672" crvType="arc" delta="138.94725576785" dirEnd="66.423714388543" dirStart="287.476458620693" external="925.970149937768" length="1212.543549877849" midOrd="324.680762068264" radius="499.999999999181" tangent="1335.436583485725">
        <Start>4896998.0370401107 6491917.5553683294</Start>
        <Center>4897148.1939981515 6492394.4755796343</Center>
        <End>4896948.2091376046 6492852.7397562303</End>
        <PI>4895724.243644949 6492318.6055583945</PI>
    </Curve>
</CoordGeom>

我使用 xsd.exe 自动生成了 类。部分生成的代码如下所示:

public partial class CoordGeom
    {
        private List<object> _items;
        private List<Feature> _feature;
        private string _desc;
        private string _name;
        private stateType _state;
        private string _oID;

        public CoordGeom()
        {
            _feature = new List<Feature>();
            _items = new List<object>();
        }

       [XmlElementAttribute("Chain", typeof(Chain))]
       [XmlElementAttribute("Curve", typeof(Curve))]
       [XmlElementAttribute("IrregularLine", typeof(IrregularLine))]
       [XmlElementAttribute("Line", typeof(Line))]
       [XmlElementAttribute("Spiral", typeof(Spiral))]
        public List<object> Items
        {
            get { return this._items; }
            set { this._items = value; }
        }

        [XmlElement("Feature")]
        public List<Feature> Feature { get; set; }

        [XmlAttribute()]
        public string desc { get; set; }

        [XmlAttribute()]
        public string name { get; set; }

        [XmlAttribute()]
        public stateType state { get; set; }

        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string oID
        {
            get{ return this._oID; }
            set{ this._oID = value; }
        }
    }

我的反序列化代码如下所示:

XmlSerializer mySerializer = new XmlSerializer(typeof(LandXML), new XmlRootAttribute(""));
TextReader myFileStream = new StreamReader("myFile.xml");
LandXML myObject = (LandXML)mySerializer.Deserialize(myFileStream);
var coordGeomItems = myObject.Alignments.Alignment[0].CoordGeom;

我的问题是,当我反序列化文件时,它被反序列化为 {LandXML.Curve}、{LandXML.Spiral} 等类型的项目列表,我不知道如何访问他们的财产。如果我能直接这样做就好了。这是屏幕截图:

编辑 1

这是初始屏幕

那么我有物品:

当我展开这个

这是在对象的顶层——它有一些 InnerXml、InnerText...如果我想实现 CoordGeom,有很多 object.Item(i).ChildNodes.Item( j). 子节点...

所有这些都是因为在某些行中,对象列表的制作方式类似于 CoordGeom 的列表

因为有多种允许的类型,所以 Items 集合被归类为对象。最简单的方法是枚举和转换每个项目:

foreach(var item in coordGeomItems.Items)
{
    var curve = item as Curve;
    if (curve != null)
    {
        // access curve properties here
    }

    var spiral = item as Spiral
    if (spiral != null)
    {
        // access spiral properties here
    }

    // ...
}

您可以构建一个曲线和螺旋线列表,并使用带有自定义 getter 的属性访问它们:

class CoordGeom
{
    public List<object> Items;

    List<Curve> _curves;
    public List<Curve> Curves
    {
        get 
        { 
            return _curves ?? (_curves = Items
                .Where(item => item is Curve).Select(curve => (Curve)curve).ToList()); 
        }
    }
}

空合并运算符 (??) 将导致曲线 属性 设置和 return _curves 的值作为曲线列表(如果 _curves 为空)。这基本上会导致它在第一次获取和所有后续获取时初始化列表,它将 return 已经初始化的列表。

因为您无法更改生成的 class 也无法更改 XML.The 最好的方法是编写扩展方法。

public static List<Curve> GetCurves(this CoordGeom cg)
{
return cg.Items.OfType<Curve>().ToList();
}

public static List<Spiral> GetSpirals(this CoordGeom cg)
{
return cg.Items.OfType<Spiral>().ToList();
}

完成后,您可以获得这样的物品

var coordGeomItems = myObject.Alignments.Alignment[0].CoordGeom;
var curves = coordGeomItems.GetCurves();
var spirals = coordGeomItems.GetSpirals();