繁体   English   中英

C#中集合的XML序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM