简体   繁体   English

将列表导出到XML,反之亦然

[英]Export list of list to XML and vice-versa

I'm trying to implement an "Open/Save" function for my Visual C# program. 我正在尝试为我的Visual C#程序实现“打开/保存”功能。 The object I need to save is a list of list. 我需要保存的对象是列表列表。 More specifically it's a List<List<Components>> , where Components is my custom class. 更具体地说,它是List<List<Components>> ,其中Components是我的自定义类。 I managed to export it and I read my variables with an XML reader, but when I imported it back into program, I got wrong variables. 我设法导出它,并使用XML阅读器读取变量,但是当我将其重新导入程序时,我得到了错误的变量。 For example, the list capacity before exporting it, was 2. After importing it, it became 4. Any help? 例如,导出之前的列表容量为2。导入之后,列表容量变为4。有什么帮助吗?
If you can suggest another way of "Open/Save" function, feel free. 如果您可以建议另一种“打开/保存”功能,请放心。 I just need to store and restore a list of lists of custom class into a file. 我只需要将自定义类列表的列表存储并还原到文件中。

public void open_click(object send, EventArgs e)
        {
            XmlSerializer xml = new XmlSerializer(typeof(List<List<Components>>));
            OpenFileDialog oDialog = new OpenFileDialog();

            oDialog.Filter = "XML|*.xml";

            if (oDialog.ShowDialog() == DialogResult.OK)
            {
                Variables.compBuffer = new List<List<Components>>();
                using (FileStream s = File.OpenRead(oDialog.FileName))
                using (StreamReader sw = new StreamReader(s))
                {
                    Variables.compBuffer = (List<List<Components>>)xml.Deserialize(s);
                }
            }
        }    

// //

public void saveAs_click(object send, EventArgs e)
{
    XmlSerializer xml = new XmlSerializer(typeof(List<List<Components>>));
    SaveFileDialog sDialog = new SaveFileDialog();

    sDialog.FileName = "myLadder";
    sDialog.Filter = "XML|*.xml";
    sDialog.OverwritePrompt = true;

    if (sDialog.ShowDialog() == DialogResult.OK)
    {
        using (FileStream s = File.OpenWrite(sDialog.FileName))
        using (StreamWriter sw = new StreamWriter(s))
        {
            xml.Serialize(s, Variables.compBuffer);
        }
    }
}    

// //

    public class Components
    {
        //Private variables
        private string _type = "empty";
        private string _name = "";
        private int _time = 0;    //If it's a "timer" (in ms)
        private int _index = -1;
        private string _comment = "";
        private bool _output = false;

        public Components() { }

        public string Type
        {
            get { return this._type; }
            set { this._type = value; }
        }
        public string Name
        {
            get { return this._name; }
            set { this._name = value; }
        }
        public int Time
        {
            get { return this._time; }
            set { this._time = value; }
        }
        public int Index
        {
            get { return this._index; }
            set { this._index = value; }
        }
        public string Comment
        {
            get { return this._comment; }
            set { this._comment = value; }
        }
        public bool Output
        {
            get { return this._output; }
            set { this._output = value; }
        }

        public void reset()
        {
            _type = "empty";
            _name = "";
            _time = 0;               //If it's a "timer" (in ms)
            _index = -1;
            _comment = "";
            _output = false;
        }
    }
}

Since you not looking into xml specific solution, I would just serialize it as a binary representation into a file, and restore it back: 由于您没有考虑xml特定的解决方案,因此我只将其作为二进制表示形式序列化到文件中,然后将其还原:

    using System.IO;

    [Serializable]    
    public class Components
    {
       ...
    }

    var components = new List<Components>();
    string pathToFile = @"c:\dev\components.bin";

    SerializeFile(pathToFile, components);
    var fetchComponents = DeserializeFile(pathToFile);

    private void SerializeFile(string file, IList<Components> data)
    {
        using (Stream stream = File.Open(file, FileMode.Create))
        {
           var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
           formatter.Serialize(stream, data);
        }
    }

    private IList<Components> DeserializeFile(string file)
    {
        using (Stream stream = File.Open(file, FileMode.Create))
        {
            var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            return (List<Components>)formatter.Deserialize(stream);
        }
    }

The drawback with this solution is you cannot look into the file and browse the data. 该解决方案的缺点是您无法查看文件并浏览数据。 Further improvements would be to use generics so you can serialize/deserialize any type of data. 进一步的改进将是使用泛型,以便您可以序列化/反序列化任何类型的数据。

Don't forget to mark your class you would like to save with the attribute [Serializable] 不要忘记使用[Serializable]属性标记要保存的班级

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM