所以我需要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字符串列表组成,字符串被正确序列化但不是字符串列表。
答案 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
成功序列化和反序列化,它必须:
ICollection<T>
(甚至IList<T>
):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的项目。