无法将对象列表(每个对象包含一个列表)序列化为xml

时间:2016-02-29 19:10:38

标签: c# xml serialization

我试图理解序列化是如何工作的,但我现在一直困在一个问题上。

我想做的是我有一个处理对象列表的经理。在这种情况下食谱。在每个食谱中都有一份成分清单。我的经理来自Listmanager类。成分列表也使用List管理器类。

我在序列化类似的管理器时使用了这个,除了我序列化为二进制(.dat)。这工作甚至与反序列化一起工作。我知道xml有点不同,但仍值得一提..

问题 - >当我序列化时,我得到的就是这个:

<?xml version="1.0"?>
<RecipeManager xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

我希望xml文档类似于这样:

<Recipe>
<Name>Food<Name>
<Ingredient>blabla<Ingredient>
<Ingredient>blabla2<Ingredient>
<Ingredient>blabla3<Ingredient>
</Recipe>

这是我的Listmanager,它有很多其他方法,但这样你就可以了解它的外观:

[Serializable]
    public class ListManager<T> : IListManager<T>
    {
        private List<T> list;

        public ListManager()
        {
            list = new List<T>();
        }
        public int Count { get { return list.Count; } }

        public void Add(T aType)
        {
            list.Add(aType);
        }

        public bool ChangeAt(T aType, int index)
        {
            if (CheckIndex(index))
            {
                list[index] = aType;
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// Tittar så det finns ett objekt på platsen som användaren valt
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool CheckIndex(int index)
        {
            if (index < 0)
            {
                return false;
            }
            else if (list[index] != null)
            {
                return true;
            }
            else
                return false;
        }

这是我的RecipeManager类:

[Serializable]
    public class RecipeManager : ListManager<Recipe>
    {
        /// <summary>
        /// Konstruktor
        /// </summary>
        public RecipeManager()
        {
            TestData();
        }

        private void TestData()
        {
            Recipe testInfo = new Recipe();

            testInfo.Name = "AnimalSuperFood";
            testInfo.IngredientsList.Add("2dl of water");
            testInfo.IngredientsList.Add("3g of meat");
            testInfo.IngredientsList.Add("1ml of lemon");
            Add(testInfo);
        }
    }

这是我的食谱类:

[Serializable]
[XmlRoot("Recipe")]
public class Recipe
{
    #region props
    private ListManager<string> ingredientsList;

    [XmlArray("Ingredient")]
    public ListManager<string> IngredientsList
    {
        get { return ingredientsList; }
    }

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    #endregion
    /// <summary>
    /// Konstruktor
    /// </summary>
    public Recipe()
    {
        ingredientsList = new ListManager<string>();
    }
    public override string ToString()
    {
        string strOut = string.Format("{0}: ", Name); ;
        for (int i = 0; i < IngredientsList.Count; i++)
        {
            if (i != (IngredientsList.Count - 1))
            {
                strOut += string.Format("{0} mixed with ", IngredientsList.GetAt(i));
            }
            else
            {
                strOut += string.Format("{0}", IngredientsList.GetAt(i));
            }
        }
        return strOut;
    }
}

这是我发送包含对象的经理的地方:

using (SaveFileDialog dlg = new SaveFileDialog())
            {
                dlg.Title = "Save xml file";
                dlg.Filter = "xml file (*.xml)|*.xml";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        SerializationUtility.XmlFileSerialize(recipeMgr, dlg.FileName);
                        MessageBox.Show("Save succesful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

            }

最后这是我序列化的地方:

  public static void XmlFileSerialize<T>(T obj, string filePath)
        {
            using (Stream s = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                XmlSerializer xmlWriter = new XmlSerializer(typeof(T));
                xmlWriter.Serialize(s, obj);
            }
        }

最后但并非最不重要的,请解释为什么我的问题很糟糕,如果你这么想的话。不要只是投票并离开..我正在努力学习..谢谢!

1 个答案:

答案 0 :(得分:2)

好的,重新阅读代码后发现问题:您要序列化的任何属性都必须公开。

您的&#34;列表&#34;在ListManager是私有的,所以它不会被序列化,也没有。

公开它,它会起作用。

您要序列化的任何其他私有财产/字段也必须是公开的。