在C#中收集的XML序列化(XML serialization of a collection in

2019-08-16 16:51发布

我有两个类,如下所示:

    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它增加了信息类,如下的两个实例:

            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,这类型的结构可以我使用?

Answer 1:

的NameValueCollection并不直接实现ICollection接口。 相反,NameValueCollection中扩展访问NameObjectCollectionBase。 这实现ICollection接口,和重载添加(system.string)方法并不NameValueCollection中类中实现。 当您使用XmlSerializer,XmlSerializer的尝试序列化或反序列化的NameValueCollection作为一般的ICollection。 因此,它查找默认的Add(System.String)。 在不存在添加(system.String)方法中,则抛出异常。

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

http://nayyeri.net/serialize-namevaluecollection

不过,我不确定你实际上是试图实现。 会是什么nvcollection包含除了书和价格,一旦作者?

你打算在书的水平,或对象层次较高的使用呢?

如果不使用的NameValueCollection的,你可能要一个解释,因为它有什么它可以包含方面更大的灵活性: http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.entry



Answer 2:

再看内部异常。

首先,你需要让Book类序列化。 第二件事情是NameValueCollection中不能与XmlSerializer的,因为被序列化:

“要XML序列化,其自ICollection继承的类型必须在其继承层次结构的各个层次添加的实现(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());
            }
        }


Answer 3:

更新:看起来像NamedValueCollection才是你真正的问题,因为它不是序列化。 也许你可以使用一个序列化的词典 。



Answer 4:

我跑你的代码,你会得到最里面的例外情况是这样的:

要XML序列化,其自ICollection继承的类型必须在其继承层次结构的各个层次添加的实现(System.String)。 System.Collections.Specialized.NameValueCollection没有实现添加(System.String)。

因此XML序列化需要一个简单的类型的集合。 我觉得你最好的选择是你转换NameValueCollection到包含序列化之前的名称和值的自定义类的列表。



文章来源: XML serialization of a collection in C#