6

我有两个类如下:

    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?

4

4 回答 4

3

NameValueCollection不直接实现ICollection接口。相反,NameValueCollection扩展 了 NameObjectCollectionBase。这里实现了ICollection接口,重载的Add(system.string) 方法在 NameValueCollection类中没有实现。当您使用XMLSerializer时, XmlSerializer会尝试将NameValueCollection序列化或反序列化为通用ICollection。因此,它会查找默认的 Add(System.String)。在没有Add(system.String)方法,抛出异常。

尝试使用具有自定义序列化的容器类:

http://nayyeri.net/serialize-namevaluecollection

但是,我不确定您实际想要达到的目标。除了书的作者和价格之外,nvcollection 将包含什么?

您打算在 Book 级别使用它,还是在对象层次结构的更高级别使用它?

而不是使用 NameValueCollection,您可能想要字典,因为它在可以包含的内容方面具有更大的灵活性:http: //johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6! 699.entry

于 2009-09-23T11:41:05.667 回答
1

查看内部异常。

首先,您需要使 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());
            }
        }
于 2009-09-23T10:23:01.383 回答
0

我运行了你的代码,你得到的最里面的异常是这样的:

要实现 XML 可序列化,从 ICollection 继承的类型必须在其继承层次结构的所有级别上都有 Add(System.String) 的实现。System.Collections.Specialized.NameValueCollection 没有实现 Add(System.String)。

所以 XML 序列化器需要一种更简单的集合。我认为您最好的选择是将您转换NameValueCollection为包含序列化之前的名称和值的自定义类的列表。

于 2009-09-23T09:59:29.520 回答
0

更新:看起来 NamedValueCollection 是您真正的问题,因为它不可序列化。也许您可以使用Serializable dictionary

于 2009-09-23T10:00:46.040 回答