C#:如何从反序列化的xml文件中访问数据

时间:2010-11-09 09:14:44

标签: c# xml serialization

我已经设置了一个xml-serialization / deserialization来保存我的应用程序中的数据。我可以反序列化非数组元素,但是当我反序列化数组时它是空的。我有一种预感,问题是在我尝试序列化/反序列化的属性的设置部分。

首先我正在尝试序列化的课程:

namespace kineticMold
{
    [Serializable()]
    public class Config
    {
        public Config() { }
        public string ComPort
        {
            get
            {
                return comPort;
            }
            set
            {
                comPort = value;
            }
        }

        [XmlArrayItem("recentFile")]
        public string[] LastOpen
        {

            get
            {
                return lastOpen;
            }
            set
            {

                    ArrayList holderList = new ArrayList();

                    holderList.Add(value);

                    for (int i = 0; i < 4; i++)
                    {

                        holderList.Add(lastOpen[i]);

                    }

                    lastOpen = (string[])lastOpen.ToArray<string>();



            }
        }

        private string comPort;
        private string[] lastOpen = new string[5];


    }
}

序列化的结果:

<?xml version="1.0" encoding="utf-8" ?> 
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ComPort>COM12</ComPort> 
    <LastOpen>
       <recentFile>test.xml</recentFile> 
       <recentFile xsi:nil="true" /> 
       <recentFile xsi:nil="true" /> 
       <recentFile xsi:nil="true" /> 
       <recentFile xsi:nil="true" /> 
    </LastOpen>
</Config>

反序列化代码:

_cf = new Config();
            XmlSerializer ser = new XmlSerializer(typeof(Config));

            if (File.Exists(settings_filepath))
            {
                FileStream fs = new FileStream(@settings_filepath, FileMode.Open);
                _cf = (Config)ser.Deserialize(fs);
                fs.Close();
            }

读取反序列化数据的代码:

 for (int i = 0; i < _cf.LastOpen.Length; i++)
            {

                if (_cf.LastOpen[i] != null)
                {
                    toolStripMenuItem1.DropDownItems.Add(_cf.LastOpen[i]);

                    recentState = true;
                }
            }

1 个答案:

答案 0 :(得分:1)

你有:

lastOpen = (string[])lastOpen.ToArray<string>();

你的意思是holderList在这里(在右边)?

此外,value在这里基本上是多余的;它可能是一个ArrayList

当然,更简单:

List<string>

(让调用代码担心要保留多少项目)