Сериализация XML набора в C#

Шов JBoss имеет утилиту сценариев, названную генералом шва, который создаст леса:

http://docs.jboss.org/seam/1.1BETA2/reference/en/html/gettingstarted.html

6
задан halfer 2 June 2019 в 09:42
поделиться

4 ответа

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

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

http://nayyeri.net/serialize-namevaluecollection

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

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

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

3
ответ дан 17 December 2019 в 07:07
поделиться

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

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

«Чтобы быть сериализуемыми в XML, типы, которые унаследовать от ICollection должен иметь реализация Add (System.String) на всех уровнях их наследования иерархия. System.Collections.Specialized.NameValueCollection не реализует Добавить (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());
            }
        }
1
ответ дан 17 December 2019 в 07:07
поделиться

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

0
ответ дан 17 December 2019 в 07:07
поделиться

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

Чтобы быть сериализуемыми в XML, типы, которые унаследовать от ICollection должен иметь реализация Add (System.String) на всех уровнях их наследования иерархия. System.Collections.Specialized.NameValueCollection не реализует Add (System.String).

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

0
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: