XMLserialize list和string的对象

时间:2015-04-04 23:14:56

标签: c# xml wpf serialization xml-serialization

所以我需要xml序列化对象的通用列表,其中对象由另一个列表和一个字符串组成。

这就是我现在所知道的

    <?xml version="1.0" encoding="UTF-8"?>

-<ArrayOfRecept xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">


-<Recept>
<Namn>Nomnom</Namn>    
</Recept>

-<Recept>    
<Namn>Ännu mer nomnom</Namn>    
</Recept>

</ArrayOfRecept>

此处仅序列化字符串值,而不是我的列表

这是我想要序列化的对象

public class Recept
    {

        private ListHanterare<string> ingredienser;
        private string namn;

        public Recept()
        {
            ingredienser = new ListHanterare<string>();
        }
        public ListHanterare<string> Ingredienser
        {
            get { return ingredienser; }

        }

        public string Namn
        {
            get { return namn; }
            set { namn = value; }
        }

    }

所以我将有一个Recept列表,我想要xml序列化,我希望xml同时显示“Namn”和“Ingredienser”列表。

这是我的序列化程序

 class XMLSerial
    {
        public static bool Serialize<T>(T obj, string filePath)
        {
            bool bok = true;

            XmlSerializer serializer = new XmlSerializer(typeof(T));
            TextWriter writer = new StreamWriter(filePath);
            try
            {
                serializer.Serialize(writer, obj);
            }
            catch
            {
                bok = false;
            }
            finally
            {
                if (writer != null)

                    writer.Close();
            }

            return bok;
        }

    }

这是在ListHanterare类中,我将对象传递给序列化程序

public bool XMLSerialize(string filePath){
            return XMLSerial.Serialize<List<T>>(lista, filePath);

编辑: 所以通过向ingredienser添加一个setter,我现在得到了这个

-<Recept>
<Ingredienser/>
<Namn>rec</Namn>
</Recept>

但是,ingredienser仍然是空的 我的ListHanterare类是一个基本的通用List类

public class ListHanterare<T> : IListHanterare<T>
    {

        private List<T> lista; // This is the list
        private int count;

        public ListHanterare()
        {
            lista = new List<T>();

        }

所以我需要序列化一个Recept对象的ListHanterare列表,其中Recept对象由一个字符串和另一个ListHanterare字符串列表组成,字符串被正确序列化但不是字符串列表。

1 个答案:

答案 0 :(得分:0)

为了XmlSerializer序列化或反序列化Ingredienser类的属性Recept,它必须具有公共设置器和公共getter:

    public ListHanterare<string> Ingredienser
    {
        get { return ingredienser; }
        set { ingredienser = value; } 
    }

如果您不这样做,XmlSerializer将忽略该属性。

您可能仍然遇到课程ListHanterare的问题,但问题中没有显示。

DataContractSerializer没有此要求。但是,要使用DataContractSerializer序列化和反序列化您的类并包含私有字段或属性,您需要使用data contract attributes对它们进行完全注释。标记为[DataMember]的私有字段和属性尽管是私有的,但仍会被序列化。但是,数据合同序列化为opt-in,因此要使用此功能,您的类需要完全归因。

<强>更新

您没有显示ListHanterare<string>课程的完整代码。为了使XmlSerializer成功序列化和反序列化,它必须:

  1. 在公开可设置和可获取的属性中提供其所有内容,或
  2. 按照此处所述实施ICollection<T>(甚至IList<T>):XmlSerializer Class
  3. 对于方法#1,您可以按如下方式修改您的类:

    public class ListHanterare<T> 
    {
        private List<T> lista; // This is the list
        private int count;
    
        public ListHanterare()
        {
            lista = new List<T>();
        }
    
        [XmlElement("Item")]
        public T[] SerializableList
        {
            get
            {
                return (lista == null ? new T [0] : lista.ToArray());
            }
            set
            {
                if (lista == null)
                    lista = new List<T>();
                lista.Clear();
                lista.AddRange(value ?? Enumerable.Empty<T>());
                count = lista.Count;
            }
        }
    }
    

    现在,您将看到序列化XML的项目。