Шов JBoss имеет утилиту сценариев, названную генералом шва, который создаст леса:
http://docs.jboss.org/seam/1.1BETA2/reference/en/html/gettingstarted.html
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
Посмотрите на внутренние исключения.
Прежде всего вам нужно сделать класс 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());
}
}
Обновлено: Похоже, NamedValueCollection - ваша настоящая проблема, поскольку она не сериализуема. Возможно, вы могли бы использовать Сериализуемый словарь .
Я запустил ваш код, и вы получите следующее внутреннее исключение:
Чтобы быть сериализуемыми в XML, типы, которые унаследовать от ICollection должен иметь реализация Add (System.String) на всех уровнях их наследования иерархия. System.Collections.Specialized.NameValueCollection не реализует Add (System.String).
Таким образом, XML-сериализатору требуется более простой вид коллекции. Я думаю, ваш лучший вариант - преобразовать вашу коллекцию NameValueCollection
в список настраиваемого класса, который содержит имя и значение перед сериализацией.