从 XML 到使用 XML 序列化 C# 的结构

from XML to structure using XML serialzation C#

我正在尝试使用 xml 序列化

阅读 xml

然而,当我尝试阅读 XML 时,我发现 xml 上名为 "Project" 的项目列表是空的。但是我有很多。

我认为我的代码中的问题在于我如何将 XML 描述为结构。

我正在附上我的 xml,我的代码会很高兴成为助手。

XML:

<MotProjects>
<Project name="IAR-PROJECT_PM_COMPLETE_PARTITION_2 -&gt; M65_COMPLETE_JS702159_Release_vB17.110" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = RELEASE_VER" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\P4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Release\M65_COMPLETE_JS702159_Release_vB17.110.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Project_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Project_Release_256k PM_Pro_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
  <Boot_path name="" />
  <Rsu_path name="" />
  <Release_path name="" />
  <Image_path name="" />
  <Catalog_number name="" />
  <Additional_text name="" />
</MotImage>
<Package name="" exec="3">
  <Release_path name="" />
  <Rsu_path name="" />
  <Migration_path name="" />
  <Default_path name="" />
  <Old_Release_path name="" />
  <Old_Default_path name="" />
  <Package_path name="" />
  <Catalog_number name="" />
  <Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
  <Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
  <Device id="1" productType="IOV" swVersion="" pathname="" />
  <Device id="2" productType="EXP33" swVersion="" pathname="" />
  <Device id="3" productType="KP250" swVersion="" pathname="" />
  <Device id="4" productType="" swVersion="" pathname="" />
  <Device id="5" productType="" swVersion="" pathname="" />
  <Catalog_number name="JS######" />
  <OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
  <File id="0" fileType="RSU" pathname="" />
  <File id="1" fileType="Main" pathname="" />
  <File id="2" fileType="Default" pathname="" />
  <File id="3" fileType="MIG" pathname="" />
  <Catalog_number name="JS######" />
  <OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
  <Item name="port" value="" />
  <Item name="default_mot_file_full_path" value="" />
  <Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
<Project name="IAR-PROJECT_DEFAULT_GENERAL_PM_LE_PARTITION_2 -&gt; M65_JXXXXXX-vB17.110_PartII_gen" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = DOWNLOAD_VER,PROJECT_PM_DEFAULT_TYPE = GEN_GSM_DEF" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\p4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Special\MOT\M65_JXXXXXX-vB17.110_PartII_gen.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Download_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Download_Release_256k PM_Pro_Download_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
  <Boot_path name="" />
  <Rsu_path name="" />
  <Release_path name="" />
  <Image_path name="" />
  <Catalog_number name="" />
  <Additional_text name="" />
 </MotImage>
<Package name="" exec="3">
  <Release_path name="" />
  <Rsu_path name="" />
  <Migration_path name="" />
  <Default_path name="" />
  <Old_Release_path name="" />
  <Old_Default_path name="" />
  <Package_path name="" />
  <Catalog_number name="" />
  <Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
  <Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
  <Device id="1" productType="IOV" swVersion="" pathname="" />
  <Device id="2" productType="EXP33" swVersion="" pathname="" />
  <Device id="3" productType="KP250" swVersion="" pathname="" />
  <Device id="4" productType="" swVersion="" pathname="" />
  <Device id="5" productType="" swVersion="" pathname="" />
  <Catalog_number name="JS######" />
  <OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
  <File id="0" fileType="RSU" pathname="" />
  <File id="1" fileType="Main" pathname="" />
  <File id="2" fileType="Default" pathname="" />
  <File id="3" fileType="MIG" pathname="" />
  <Catalog_number name="JS######" />
  <OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
  <Item name="port" value="" />
  <Item name="default_mot_file_full_path" value="" />
  <Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
</MotProjects>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace XMLParser
{
[XmlRoot("MotProjects")]
public class XMLStructure
{

    [XmlArrayItem("Project")]
    List<Project> LProject;

    public XMLStructure()
    {
        LProject = new List<Project>();

    }

    public class  Project
    {
        [XmlAttribute("name")]
        public string name;

        [XmlAttribute("exec")]
        public string exec;


        [XmlElement("Include")]
        public NameElement Include;

        [XmlElement("Ref_mot")]
        public NameElement Ref_mot;

        [XmlElement("Folder")]
        public NameElement Folder;

        [XmlElement("MotCommand")]
        public NameElement MotCommand;

        [XmlElement("Param4MotCommand")]
        public NameElement Param4MotCommand;

        [XmlElement("ExtraDefine")]
        public NameElement ExtraDefine;

        [XmlElement("Package")]
        public Package MYPackage;

        [XmlElement("MotImage")]
        public MotImage Mot_Image;


        [XmlElement("MigrationAndDevicesBin")]
        public MigrationAndDevicesBin _MigrationAndDevicesBin;

        [XmlElement("SerialFlashHexImage")]
        public SerialFlashHexImage MYSerialFlashHexImage;

        [XmlElement("Flasher")]
        public Flasher MFlasher;



        public Project()
        {
            name = "";
            exec = "";
            Include = new NameElement();
            Ref_mot = new NameElement();
            Folder = new NameElement();
            MotCommand = new NameElement();
            Param4MotCommand = new NameElement();
            ExtraDefine = new NameElement();
            Mot_Image = new MotImage();
            MYPackage = new Package();
            _MigrationAndDevicesBin = new MigrationAndDevicesBin();
            MYSerialFlashHexImage = new SerialFlashHexImage ();
            MFlasher = new Flasher();
        }



         public class NameElement 
         {
             [XmlElement("name")]
             public string name;


             public NameElement()
             {
                 name = "";
             }

         }

         public class MotImage
         {
             [XmlAttribute("name")]
             public string name;

             [XmlAttribute("exec")]
             public string exec;

             [XmlElement("Boot_path")]
             public NameElement Boot_path;

             [XmlElement("Rsu_path")]
             public NameElement Rsu_path;

             [XmlElement("Release_path")]
             public NameElement Release_path;

             [XmlElement("Image_path")]
             public NameElement Image_path;

             [XmlElement("Catalog_number")]
             public NameElement Catalog_number;

             [XmlElement("Additional_text")]
             public NameElement Additional_text;


             public MotImage()
             {
                 name = "";
                 exec = "";
                 Boot_path = new NameElement();
                 Rsu_path = new NameElement();
                 Release_path = new NameElement();
                 Image_path = new NameElement();
                 Catalog_number = new NameElement();
                 Additional_text = new NameElement();
             }

             public class NameElement
             {
                 [XmlElement("name")]
                 public string name;

                 public NameElement()
                 {
                     name = "";
                 }

             }
         }


         public class Package
         {


             [XmlAttribute("name")]
             public string name;

             [XmlAttribute("exec")]
             public string exec;

             [XmlAttribute("Release_path")]
             public NameElement Release_path;

             [XmlAttribute("Rsu_path")]
             public NameElement Rsu_path;

             [XmlElement("Migration_path")]
             public NameElement Migration_path;

             [XmlElement("Default_path")]
             public NameElement Default_path;

             [XmlElement("Old_Release_path")]
             public NameElement Old_Release_path;

             [XmlElement("Old_Default_path")]
             public NameElement Old_Default_path;

             [XmlElement("Package_path")]
             public NameElement Package_path;

             [XmlElement("Additional_text")]
             public NameElement Additional_text;

             [XmlElement("Catalog_number")]
             public NameElement Catalog_number;

             public Package()
             {
                 name = "";
                 exec = "";
                 Release_path = new NameElement();
                 Rsu_path = new NameElement();
                 Migration_path = new NameElement();
                 Default_path = new NameElement();
                 Old_Default_path = new NameElement();
                 Old_Release_path = new NameElement();
                 Rsu_path = new NameElement();
                 Release_path = new NameElement();                    
                 Catalog_number = new NameElement();
                 Additional_text = new NameElement();
             }

             public class NameElement
             {
                 [XmlElement("name")]
                 public string name;

                 public NameElement()
                 {
                     name = "";
                 }

             }
         }


         public class MigrationAndDevicesBin
         {
             [XmlAttribute("name")]
             public string name;

             [XmlAttribute("exec")]
             public string exec;

             [XmlArray("Device")]
             public List<Device> _Device;

             [XmlElement("Catalog_number")]
             public NameElement Catalog_number;

             [XmlElement("OutputFile")]
             public OutputFile OutPutFile;

             public MigrationAndDevicesBin()
             {
                 name = "";
                 exec = "";
                 _Device = new List<Device>();
                 Catalog_number = new NameElement();
                 OutPutFile = new OutputFile();
             }
         }

         public class Device
         {


             [XmlAttribute("id")]
             public string id;

             [XmlAttribute("productType")]
             public string productType;

             [XmlAttribute("swVersion")]
             public string swVersion;

             [XmlAttribute("pathname")]
             public string pathname;


             public Device()
             {
                 id = "";
                 productType = "";
                 swVersion = "";
                 pathname = "";



             }

         }


         public class OutputFile
         {

             [XmlElement("pathname")]
             public string pathname;

             public OutputFile()
             {
                 pathname = "";
             }

         }


         public class SerialFlashHexImage
         {
                           [XmlAttribute("name")]
             public string name;

             [XmlAttribute("exec")]
             public string exec;

             public SerialFlashHexImage()
             {
                name="";
                 exec="";
             }

             public class File
             {
                 [XmlAttribute("name")]
                 public string name;

                 [XmlAttribute("exec")]
                 public string exec;

                 [XmlAttribute("id")]
                 public string id;

                 [XmlAttribute("fileType")]
                 public string fileType;

                 [XmlAttribute("pathname")]
                 public string pathname;

                 [XmlElement("OutputFile")]
                 public OutputFile OutputFile;

                 [XmlElement("Catalog_number")]
                 public NameElement Catalog_number; 


                 public File()
                 {
                     name = "";
                     exec = "";
                     id = "";
                     fileType = "";
                     pathname = "";
                     OutputFile = new OutputFile();
                     Catalog_number = new NameElement();
                 }

             }

         }


         public class Flasher
         {

             [XmlArray("Item")]
             public Item items;

             public Flasher()
             {
                 items = new Item();
             }

             public class Item
             {

                 [XmlAttribute("name")]
                 public string name;

                 [XmlAttribute("value")]
                 public string value;


                 public Item()
                 {
                     name = "";
                     value = "";
                 }

             }

         }


    }


   }
  }

你的初始问题如下:

  1. 您的 List<Project> LProject; 需要是 public,并用 [XmlElement] 标记以指示它应该在没有外部容器元素的情况下进行序列化:

    // Fixed - made public and marked with [XmlElement]
    [XmlElement("Project")]
    public List<Project> LProject;
    

    XmlSerializer 仅序列化 public 属性和字段,即使标记有 XML serialization attribute.

然而,在我修复此问题并尝试反序列化样本 XML 之后,我发现了更多问题:

  1. 在您的 class 层次结构中有多个类型 NameElement 的副本。这会导致 XmlSerializer 抛出以下异常:

    // InnerException: System.InvalidOperationException
    // Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
    

    解决方案是消除重复项并保留一个定义:

    // Fixed - removed duplicates.
    // InnerException: System.InvalidOperationException
    // Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
    public class NameElement 
    {
        // Fixed
        // This was marked as an element but should be an attribute
        [XmlAttribute("name")]
        public string name;
    
        public NameElement()
        {
            name = "";
        }
    }
    
  2. NameElement中,name应该标为[XmlAttribute]而不是[XmlElement],如上图

  3. Project缺少几个属性:

        // Fixed missing property
        [XmlElement("Defines")]
        public NameElement Defines;
    
        // Fixed missing property
        [XmlElement("Make")]
        public NameElement Make;
    
        // Fixed missing property
        [XmlElement("Include")]
        public NameElement Include;
    
  4. Package 中,几个复杂的属性用 [XmlAttribute] 标记。只有简单的属性(可以转换为字符串的属性)才能如此标记。这些属性需要标记为[XmlElement]:

            // InnerException: System.InvalidOperationException
            // Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
            [XmlElement("Release_path")]
            public NameElement Release_path;
    
            // Fixed
            // InnerException: System.InvalidOperationException
            // Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
            [XmlElement("Rsu_path")] // Fixed 
            public NameElement Rsu_path;
    
  5. MigrationAndDevicesBin中属性_Device需要用[XmlElement]标记而不是[XmlArray]:

        public class MigrationAndDevicesBin
        {
            [XmlAttribute("name")]
            public string name;
    
            [XmlAttribute("exec")]
            public string exec;
    
            // Fixed - should be [XmlElement]
            [XmlElement("Device")]
            public List<Device> _Device;
    
  6. SerialFlashHexImage 中甚至从未使用过嵌套类型 File。需要 属性 public List<File> Files { get; set; }:

        public class SerialFlashHexImage
        {
            [XmlAttribute("name")]
            public string name;
    
            [XmlAttribute("exec")]
            public string exec;
    
            // Fixed - the type File was not even used!
            [XmlElement("File")]
            public List<File> Files { get; set; }
    
            public SerialFlashHexImage()
            {
                this.Files = new List<File>();
                name = "";
                exec = "";
            }
    
  7. Flasher中,缺少nameexec对应的属性:

        public class Flasher
        {
            // Fixed - missing attribute
            [XmlAttribute("name")]
            public string name;
    
            // Fixed - missing attribute
            [XmlAttribute("exec")]
            public string exec;
    
  8. 同样在Flasher中,items需要是一个集合,而不是单例:

        public class Flasher
        {
            //Fixed
            //InnerException: System.InvalidOperationException
            //Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement."
            [XmlElement("Item")]
            public List<Item> items;
    

就我所知。样本 fiddle。 XML 可以成功加载并且 most 数据似乎存在,但我没有完全调试它,因为这样做超出了 Whosebug 问题的范围。

老实说,问题太多了。我建议您放弃手动创建 c# classes 来反序列化此 XML 的尝试,而是使用 https://xmltocsharp.azurewebsites.net/ or Paste XML as Classes 等自动代码生成工具创建 classes。 =50=]

以下是我对您的类型的最后修改:

[XmlRoot("MotProjects")]
public class XMLStructure
{
    // Fixed - made public and marked with [XmlElement]
    [XmlElement("Project")]
    public List<Project> LProject;

    public XMLStructure()
    {
        LProject = new List<Project>();
    }

    // Fixed - removed duplicates.
    // InnerException: System.InvalidOperationException
    // Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
    public class NameElement 
    {
        // Fixed
        // This was marked as an element but should be an attribute
        [XmlAttribute("name")]
        public string name;

        public NameElement()
        {
            name = "";
        }
    }

    public class Project
    {
        [XmlAttribute("name")]
        public string name;

        [XmlAttribute("exec")]
        public string exec;

        // Fixed missing property
        [XmlElement("Defines")]
        public NameElement Defines;

        // Fixed missing property
        [XmlElement("Make")]
        public NameElement Make;

        // Fixed missing property
        [XmlElement("Include")]
        public NameElement Include;

        [XmlElement("Ref_mot")]
        public NameElement Ref_mot;

        [XmlElement("Folder")]
        public NameElement Folder;

        [XmlElement("MotCommand")]
        public NameElement MotCommand;

        [XmlElement("Param4MotCommand")]
        public NameElement Param4MotCommand;

        [XmlElement("ExtraDefine")]
        public NameElement ExtraDefine;

        [XmlElement("Package")]
        public Package MYPackage;

        [XmlElement("MotImage")]
        public MotImage Mot_Image;

        [XmlElement("MigrationAndDevicesBin")]
        public MigrationAndDevicesBin _MigrationAndDevicesBin;

        [XmlElement("SerialFlashHexImage")]
        public SerialFlashHexImage MYSerialFlashHexImage;

        [XmlElement("Flasher")]
        public Flasher MFlasher;

        public Project()
        {
            name = "";
            exec = "";
            Include = new NameElement();
            Ref_mot = new NameElement();
            Folder = new NameElement();
            MotCommand = new NameElement();
            Param4MotCommand = new NameElement();
            ExtraDefine = new NameElement();
            Mot_Image = new MotImage();
            MYPackage = new Package();
            _MigrationAndDevicesBin = new MigrationAndDevicesBin();
            MYSerialFlashHexImage = new SerialFlashHexImage();
            MFlasher = new Flasher();
        }

        public class MotImage
        {
            [XmlAttribute("name")]
            public string name;

            [XmlAttribute("exec")]
            public string exec;

            [XmlElement("Boot_path")]
            public NameElement Boot_path;

            [XmlElement("Rsu_path")]
            public NameElement Rsu_path;

            [XmlElement("Release_path")]
            public NameElement Release_path;

            [XmlElement("Image_path")]
            public NameElement Image_path;

            [XmlElement("Catalog_number")]
            public NameElement Catalog_number;

            [XmlElement("Additional_text")]
            public NameElement Additional_text;

            public MotImage()
            {
                name = "";
                exec = "";
                Boot_path = new NameElement();
                Rsu_path = new NameElement();
                Release_path = new NameElement();
                Image_path = new NameElement();
                Catalog_number = new NameElement();
                Additional_text = new NameElement();
            }
        }

        public class Package
        {
            [XmlAttribute("name")]
            public string name;

            [XmlAttribute("exec")]
            public string exec;

            // Fixed
            // InnerException: System.InvalidOperationException
            // Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
            [XmlElement("Release_path")]
            public NameElement Release_path;

            // Fixed
            // InnerException: System.InvalidOperationException
            // Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
            [XmlElement("Rsu_path")] // Fixed 
            public NameElement Rsu_path;

            [XmlElement("Migration_path")]
            public NameElement Migration_path;

            [XmlElement("Default_path")]
            public NameElement Default_path;

            [XmlElement("Old_Release_path")]
            public NameElement Old_Release_path;

            [XmlElement("Old_Default_path")]
            public NameElement Old_Default_path;

            [XmlElement("Package_path")]
            public NameElement Package_path;

            [XmlElement("Additional_text")]
            public NameElement Additional_text;

            [XmlElement("Catalog_number")]
            public NameElement Catalog_number;

            public Package()
            {
                name = "";
                exec = "";
                Release_path = new NameElement();
                Rsu_path = new NameElement();
                Migration_path = new NameElement();
                Default_path = new NameElement();
                Old_Default_path = new NameElement();
                Old_Release_path = new NameElement();
                Rsu_path = new NameElement();
                Release_path = new NameElement();
                Catalog_number = new NameElement();
                Additional_text = new NameElement();
            }
        }

        public class MigrationAndDevicesBin
        {
            [XmlAttribute("name")]
            public string name;

            [XmlAttribute("exec")]
            public string exec;

            // Fixed - should be [XmlElement]
            [XmlElement("Device")]
            public List<Device> _Device;

            [XmlElement("Catalog_number")]
            public NameElement Catalog_number;

            [XmlElement("OutputFile")]
            public OutputFile OutPutFile;

            public MigrationAndDevicesBin()
            {
                name = "";
                exec = "";
                _Device = new List<Device>();
                Catalog_number = new NameElement();
                OutPutFile = new OutputFile();
            }
        }

        public class Device
        {
            [XmlAttribute("id")]
            public string id;

            [XmlAttribute("productType")]
            public string productType;

            [XmlAttribute("swVersion")]
            public string swVersion;

            [XmlAttribute("pathname")]
            public string pathname;


            public Device()
            {
                id = "";
                productType = "";
                swVersion = "";
                pathname = "";
            }
        }

        public class OutputFile
        {
            [XmlElement("pathname")]
            public string pathname;

            public OutputFile()
            {
                pathname = "";
            }
        }

        public class SerialFlashHexImage
        {
            [XmlAttribute("name")]
            public string name;

            [XmlAttribute("exec")]
            public string exec;

            // Fixed - the type File was not even used!
            [XmlElement("File")]
            public List<File> Files { get; set; }

            public SerialFlashHexImage()
            {
                this.Files = new List<File>();
                name = "";
                exec = "";
            }

            public class File
            {
                [XmlAttribute("name")]
                public string name;

                [XmlAttribute("exec")]
                public string exec;

                [XmlAttribute("id")]
                public string id;

                [XmlAttribute("fileType")]
                public string fileType;

                [XmlAttribute("pathname")]
                public string pathname;

                [XmlElement("OutputFile")]
                public OutputFile OutputFile;

                [XmlElement("Catalog_number")]
                public NameElement Catalog_number;

                public File()
                {
                    name = "";
                    exec = "";
                    id = "";
                    fileType = "";
                    pathname = "";
                    OutputFile = new OutputFile();
                    Catalog_number = new NameElement();
                }
            }
        }

        public class Flasher
        {
            // Fixed - missing attribute
            [XmlAttribute("name")]
            public string name;

            // Fixed - missing attribute
            [XmlAttribute("exec")]
            public string exec;

            //Fixed
            //InnerException: System.InvalidOperationException
            //Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement."
            [XmlElement("Item")]
            public List<Item> items;

            public Flasher()
            {
                items = new List<Item>();
                name = "";
                exec = "";
            }

            public class Item
            {
                [XmlAttribute("name")]
                public string name;

                [XmlAttribute("value")]
                public string value;

                public Item()
                {
                    name = "";
                    value = "";
                }
            }
        }
    }
}