我试图理解序列化是如何工作的,但我现在一直困在一个问题上。
我想做的是我有一个处理对象列表的经理。在这种情况下食谱。在每个食谱中都有一份成分清单。我的经理来自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);
}
}
最后但并非最不重要的,请解释为什么我的问题很糟糕,如果你这么想的话。不要只是投票并离开..我正在努力学习..谢谢!
答案 0 :(得分:2)
好的,重新阅读代码后发现问题:您要序列化的任何属性都必须公开。
您的&#34;列表&#34;在ListManager是私有的,所以它不会被序列化,也没有。
公开它,它会起作用。
您要序列化的任何其他私有财产/字段也必须是公开的。