【问题标题】:XMLserialize object of list and stringXMLserialize 列表和字符串的对象
【发布时间】:2015-06-09 17:43:21
【问题描述】:

所以我需要 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; }
        }

    }

所以我将有一个我想要 xml 序列化的 Recept 列表,并且我希望 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 添加一个设置器,我现在得到了这个

-<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 字符串列表组成,该字符串被正确序列化,但不是字符串列表。

【问题讨论】:

  • 将 XML 元素添加到您的接收类,以便您的序列化程序知道要反序列化什么。此外,您没有反序列化您的元素,您只是在流式传输并将值返回为 TRUE - bool。你没有返回任何错误或真实的东西。
  • 我的类声明上方有一个 [Serializable]
  • [Serializable] 用于二进制格式而不是XmlSerializer

标签: c# xml wpf serialization xml-serialization


【解决方案1】:

为了让XmlSerializer 序列化或反序列化您的Recept 类的属性Ingredienser,它必须有一个公共的setter 和一个公共的getter:

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

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

ListHanterare 类可能仍然存在问题,但您的问题中没有显示。

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

更新

您没有显示ListHanterare&lt;string&gt; 类的完整代码。为了让XmlSerializer 成功地对其进行序列化和反序列化,它必须:

  1. 在可公开设置和可获取的属性中提供其所有内容,或
  2. 按照此处所述实现ICollection&lt;T&gt;(甚至IList&lt;T&gt;):XmlSerializer Class

对于方法 #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 序列化的项目。

【讨论】:

  • 通过给它一个 setter 给我这个结果 hehe 使用 DataContractSerializer 会解决这个问题吗?
  • @user3621898 - 你的ListHanterare 类是什么样的?如果它的内容没有被序列化,那么问题可能就在那里。
  • @user3621898 - 可能你的ListHanterare 没有XmlSerializer 要求的可公开设置的属性——但我不能肯定。能不能展示一下ListHanterare的完整代码?
  • 谢谢你的代码,你能解释一下 get 行是如何工作的吗?也是双问号线
  • 我得到的结果看起来像这样 ingrediens 无论如何让它没有可序列化的标签?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多