[英]XML serialization of a collection in C#
我有两个课程如下:
public class Info
{
[XmlAttribute] public string language;
public int version;
public Book book;
public Info() { }
public Info(string l, int v, string author, int quantity, int price)
{
this.language = l;
this.version = v;
book = new Book(author, quantity, price);
}
}
public class Book
{
[XmlAttribute] public string author;
public int quantity;
public int price;
[XmlIgnore]public int total;
public NameValueCollection nvcollection = new NameValueCollection();
public Book() { }
public Book(string author, int quantity, int price)
{
this.author = author;
this.quantity = quantity;
this.price = price;
total = quantity * price;
nvcollection.Add(author, price.ToString());
}
}
我创建了一个ArrayList,它添加了Info类的两个实例,如下所示:
FileStream fs = new FileStream("SerializedInfo.XML", FileMode.Create);
List<Info> arrList = new List<Info>();
XmlSerializer xs = new XmlSerializer(typeof(List<Info>));
Info pObj = new Info("ABC", 3, "DEF", 2, 6);
Info pObj1 = new Info("GHI", 4, "JKL", 2, 8);
arrList.Add(pObj);
arrList.Add(pObj1);
xs.Serialize(fs, arrList);
fs.Close();
但是当我尝试序列化时,我得到一个异常,因为“有一个错误反映了类型'System.Collections.Generic.List`1 [ConsoleApplicationSerialization.Info]'。”
我该怎么调试呢?
另外,我可以使用哪种类型的结构代替namevaluecollection?
NameValueCollection不直接实现ICollection接口。 相反, NameValueCollection扩展了NameObjectCollectionBase 。 这实现了ICollection接口,并且NameValueCollection类中未实现重载的Add(system.string)方法。 当您使用XMLSerializer时 , XmlSerializer会尝试将NameValueCollection序列化或反序列化为通用ICollection 。 因此,它查找默认的Add(System.String) 。 如果没有Add(system.String)方法,则抛出异常。
尝试使用具有自定义序列化的容器类:
http://nayyeri.net/serialize-namevaluecollection
但是,我不确定你实际上想要实现的目标。 除了书籍的作者和价格之外,nvcollection将包含什么?
您是打算在Book级别使用它,还是在对象层次结构中使用它?
您可能希望使用Dictionary而不是使用NameValueCollection,因为它在包含的内容方面具有更大的灵活性: http : //johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.entry
看看内部异常。
首先,您需要使Book类可序列化。 第二件事是NameValueCollection无法使用XmlSerializer序列化,因为:
“要进行XML可序列化,从ICollection继承的类型必须在其继承层次结构的所有级别都具有Add(System.String)的实现.System.Collections.Specialized.NameValueCollection不实现Add(System.String)。”
这是来自内部异常的消息。
使用这段代码可以正常工作:
[Serializable]
public class Book
{
[XmlAttribute]
public string author;
public int quantity;
public int price;
[XmlIgnore]
public int total;
//public NameValueCollection nvcollection = new NameValueCollection();
public Book() { }
public Book(string author, int quantity, int price)
{
this.author = author;
this.quantity = quantity;
this.price = price;
total = quantity * price;
//nvcollection.Add(author, price.ToString());
}
}
我运行了你的代码,你得到的最内层的例外是:
要进行XML可序列化,从ICollection继承的类型必须在其继承层次结构的所有级别都具有Add(System.String)的实现。 System.Collections.Specialized.NameValueCollection未实现Add(System.String)。
因此XML序列化器需要更简单的集合。 我认为您最好的选择是将NameValueCollection
转换为包含序列化之前的名称和值的自定义类的列表。
更新:看起来NamedValueCollection是您真正的问题,因为它不可序列化。 也许你可以使用Serializable字典 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.