列表和字符串的 XMLserialize 对象
XMLserialize object of list and string
所以我需要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>
这里只序列化了字符串值而不是我的List
这是我要序列化的对象
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 中 class 我将对象传递给序列化程序的地方
public bool XMLSerialize(string filePath){
return XMLSerial.Serialize<List<T>>(lista, filePath);
编辑:
因此,通过向 ingredienser 添加 setter,我现在得到了这个
-<Recept>
<Ingredienser/>
<Namn>rec</Namn>
</Recept>
但是配料器还是空的
我的 ListHanterare class 是一个基本的通用列表 class
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 字符串列表组成,字符串被正确序列化但不是字符串列表。
为了 XmlSerializer
序列化或反序列化您的 Recept
class 的 属性 Ingredienser
,它必须有一个 public setter 以及 public getter:
public ListHanterare<string> Ingredienser
{
get { return ingredienser; }
set { ingredienser = value; }
}
如果您不这样做,XmlSerializer
将忽略 属性。
您可能仍然对 class ListHanterare
有疑问,但它没有显示在您的问题中。
DataContractSerializer
does not have this requirement. However, to serialize and deserialize your classes with DataContractSerializer
and include private fields or properties, you would need to fully annotate them with data contract attributes. Private field and properties marked with [DataMember]
get serialized despite being private. Data contract serialization is opt-in,但是,要使用此功能,您的 classes 需要完全归因。
更新
您没有显示 ListHanterare<string>
class 的完整代码。为了 XmlSerializer
成功序列化和反序列化它,它必须:
- 使其所有内容在public仅可设置和可获取的属性中可用,或
- 按照此处所述实施
ICollection<T>
(甚至 IList<T>
):XmlSerializer Class.
对于方法 #1,您可以按如下方式修改 class:
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 的项目。
所以我需要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>
这里只序列化了字符串值而不是我的List
这是我要序列化的对象
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 中 class 我将对象传递给序列化程序的地方
public bool XMLSerialize(string filePath){
return XMLSerial.Serialize<List<T>>(lista, filePath);
编辑: 因此,通过向 ingredienser 添加 setter,我现在得到了这个
-<Recept>
<Ingredienser/>
<Namn>rec</Namn>
</Recept>
但是配料器还是空的 我的 ListHanterare class 是一个基本的通用列表 class
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 字符串列表组成,字符串被正确序列化但不是字符串列表。
为了 XmlSerializer
序列化或反序列化您的 Recept
class 的 属性 Ingredienser
,它必须有一个 public setter 以及 public getter:
public ListHanterare<string> Ingredienser
{
get { return ingredienser; }
set { ingredienser = value; }
}
如果您不这样做,XmlSerializer
将忽略 属性。
您可能仍然对 class ListHanterare
有疑问,但它没有显示在您的问题中。
DataContractSerializer
does not have this requirement. However, to serialize and deserialize your classes with DataContractSerializer
and include private fields or properties, you would need to fully annotate them with data contract attributes. Private field and properties marked with [DataMember]
get serialized despite being private. Data contract serialization is opt-in,但是,要使用此功能,您的 classes 需要完全归因。
更新
您没有显示 ListHanterare<string>
class 的完整代码。为了 XmlSerializer
成功序列化和反序列化它,它必须:
- 使其所有内容在public仅可设置和可获取的属性中可用,或
- 按照此处所述实施
ICollection<T>
(甚至IList<T>
):XmlSerializer Class.
对于方法 #1,您可以按如下方式修改 class:
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 的项目。