XML-сериализация коллекции на языке 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(); 

но когда я пытаюсь сериализовать, я получаю исключение как "была ошибка, отражающая тип" система.Сборники.Общий.Список ' 1[ConsoleApplicationSerialization.Info]'."

может кто-нибудь помочь мне с этим?

кроме того, вместо namevaluecollection, какой тип структуры я могу использовать?

4 ответов


namevaluecollection, который не напрямую реализовать ICollection интерфейс. Вместо namevaluecollection, который расширяет NameObjectCollectionBase. Этот реализует ICollection интерфейс, а перегруженные добавить(системы.string) метод не реализован в namevaluecollection, который класса. Когда вы используйте сериализатор XmlSerializer, в XmlSerializer пытается сериализовать или десериализовать namevaluecollection, который as общий ICollection. Поэтому выглядит по умолчанию Добавить(Системы.String). В отсутствие the добавить(системы.String) метод, исключение.

попробуйте использовать класс контейнера с custom сериализация:

http://nayyeri.net/serialize-namevaluecollection

однако, я не уверен, что вы на самом деле пытаетесь достичь. Что будет содержать nvcollection, кроме автора книги и цены, один раз?

вы собираетесь использовать его на уровне книги или выше в иерархии объектов?

вместо использования NameValueCollection Вам может понадобиться словарь, поскольку он имеет большую гибкость с точки зрения того, что он может содержать:http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.запись


смотреть на внутренние исключения.

прежде всего вам нужно сделать класс книги сериализуемым. Во-вторых, NameValueCollection не может быть сериализован с помощью XmlSerializer, потому что:

" для сериализации XML, типы которых наследование от ICollection должно иметь реализация Add (System.Строка) на всех уровнях их наследования иерархия. Система.Коллекции.Специализированный.Namevaluecollection, который не реализует Добавить(Системы.Строка.)"

это сообщение от внутренней исключением.

отлично работает с этим фрагментом кода:

  [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());
            }
        }

обновление: похоже, что NamedValueCollection - ваша реальная проблема, поскольку она не сериализуема. Возможно, вы могли бы использовать сериализовать словарь.


Я запустил ваш код, и самое внутреннее исключение, которое вы получаете, это:

для сериализации XML, типы которых наследование от ICollection должно иметь реализация Add (System.Строка) на всех уровнях их наследования иерархия. Система.Коллекции.Специализированный.Namevaluecollection, который не реализует Add (System.Строка.)

таким образом, сериализатор XML нуждается в более простом виде коллекции. Я думаю, что ваш лучший вариант-конвертировать ваш NameValueCollection to список пользовательского класса, который содержит имя и значение перед сериализацией.