序列化对象列表

时间:2016-03-04 16:56:31

标签: c# xml serialization xml-deserialization

我需要序列化/反序列化一些XML代码,其中一部分看起来像下一个例子:

<link rel="import" href="https://raw.githubusercontent.com/Polymer/polymer/master/polymer.html">

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

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

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

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

我的问题是,当我反序列化文件时,它被反序列化为{LandXML.Curve},{LandXML.Spiral}等类型的项目列表,我不知道如何访问它们的属性。如果我可以直接这样做会很棒。这是一个截图:

Debugging screenshot

编辑1

这是初始屏幕 enter image description here

然后我有项目:

enter image description here

当我展开这个

enter image description here

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

所有这一切都是因为在某些行中,对象列表就像CoordGeom一样像List一样

3 个答案:

答案 0 :(得分:3)

因为有多个允许的类型,所以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
    }

    // ...
}

答案 1 :(得分:1)

您可以构建一个Curves和Spirals列表,并使用自定义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()); 
        }
    }
}

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

答案 2 :(得分:1)

因为你无法改变生成的类和XML。最好的方法是编写扩展方法。

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();