将列表保存到 XML

Posted

技术标签:

【中文标题】将列表保存到 XML【英文标题】:Saving List to XML 【发布时间】:2013-12-14 23:55:41 【问题描述】:

我正在尝试将我的列表保存到一个 XML 文件中,以便稍后在重新打开程序时再次加载数据。

这是我尝试保存数据的代码:

public static void SerializeToXml<T>(T obj, string fileName)
    
        using (var fileStream = new FileStream(@"C:\\Users\\Kevin\\Desktop\\Save.XML", FileMode.Create))
        
            var ser = new XmlSerializer(typeof(T));
            ser.Serialize(fileStream, obj);
            fileStream.Close();
        
    

我使用这段代码来调用函数:

Saving.SerializeToXml<List<Vara>>(minaVaror, @"C:\\Users\\Kevin\\Desktop\\Save.XML");

但是,当我单击按钮尝试保存数据时,程序崩溃了,我留下了这个错误/警告:

Barline_1.Vara is inaccessible due to its protection level. Only public types can be processed.

这是它抱怨的代码行:

var ser = new XmlSerializer(typeof(T));

有什么想法可能是错的吗?

【问题讨论】:

作为一个站点说明:fileNameSerializeToXml 中有什么用? 您是否认为Barline_1 的定义与问题无关,所以没有发布? 【参考方案1】:

根据定义,XmlSerializer 不能反序列化 List 或 ArrayList 来自Msdn

The XmlSerializer cannot deserialize the following: arrays of ArrayList and arrays of List<T>.

所以你可以序列化一个 List 但你不能反序列化 List

因此您可以使用此代码在 Xml 中序列化并反序列化 xml 文件

namespace DataContractSerializerExample

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Xml;

    // You must apply a DataContractAttribute or SerializableAttribute 
    // to a class to have it serialized by the DataContractSerializer.
     [DataContract(Name = "Vara", Namespace = "http://www.contoso.com")]
   public class Vara
    
        [DataMember()]
        public double streckKod  get; set; 
        [DataMember]
        public string artNamn  get; set; 
    

    public sealed class Test
    
        private Test()  

        public static void Main()
        
            List<Vara> minaVaror = new List<Vara>()  new Vara()  streckKod = 5.0, artNamn = "test1" , new Vara()  streckKod = 5.0, artNamn = "test2" , new Vara()  streckKod = 5.0, artNamn = "test3"  ;
            string fileName = "test.xml";
            Serialize<List<Vara>>(fileName, minaVaror);
            List<Vara> listDes = Deserialize<List<Vara>>(fileName);  






        

        public static void Serialize<T>(string fileName,T obj )
                   
            FileStream writer = new FileStream(fileName, FileMode.Create);
            DataContractSerializer ser =
                new DataContractSerializer(typeof(T));
            ser.WriteObject(writer, obj);
            writer.Close(); 
        

        public static T Deserialize<T>(string fileName)
        
            FileStream fs = new FileStream(fileName,
            FileMode.Open);
            XmlDictionaryReader reader =
                XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
            DataContractSerializer ser = new DataContractSerializer(typeof(T));                        
            T  des  =
                (T)ser.ReadObject(reader, true);
            reader.Close();
            fs.Close();
            return des;  
        
    

注意: 您应该添加对 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Runtime.Serialization.dll

【讨论】:

以上是关于将列表保存到 XML的主要内容,如果未能解决你的问题,请参考以下文章

如何将目录列表保存到xml文件C#

如何使用 linq to xml 将列表保存在对象内?

将每次迭代生成的数据框保存在列表中

在 XML 设置文件中创建字符串列表

将保存在数据库 sqlite 中的列表视图中的一行发送到另一个列表视图,并使其与第一个列表视图中的行相同

在 XML 文档中搜索值列表