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 список пользовательского класса, который содержит имя и значение перед сериализацией.