С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/141: Рейтинг темы: голосов - 141, средняя оценка - 4.55
10 / 10 / 1
Регистрация: 06.11.2009
Сообщений: 19
1

Сериализация коллекции List<>

24.05.2010, 16:01. Показов 27676. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня вопрос: soap и xml сериализации работают с коллекциями? У меня вот такой код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class serialization
    {
       List<Planet> list;
       public serialization()
       {
           list = new List<Planet>();
           
           
       }
 
       public Planet ADD
       {
           set {
               list.Add(value);
                 
               }
       }
 
       public void SoapSerial()
       {
           SaveFileDialog sf = new SaveFileDialog();
           sf.DefaultExt = ".sop";
           if (sf.ShowDialog() == DialogResult.OK)
           {
               try
               {
                   FileStream fs = File.Create(sf.FileName);
                   SoapFormatter sof = new SoapFormatter();
                   sof.Serialize(fs, this.list);
                   fs.Close();
               }
               catch
               {
                   this.Error();
               }
           }
       }
}
Все компилится, но при спопытке сериализации выдает ошибку:
Soap Serializer does not support serializing Generic Types : System.Collections.Generic.List`1[WindowsApplication1.Planet].

Подскажите, может как то иначе удастся сериализовать эту коллекцию?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2010, 16:01
Ответы с готовыми решениями:

Сериализация коллекции
Всем добрый день) Не могу понять как мне сериализовать коллекцию в которой содержатся графические...

Сериализация коллекции в текстовый файл .NET/C#
У меня такой вот вопрос: У меня есть коллекция List&lt;Worker&gt; workers = new List&lt;Worker&gt;();,...

Самописная сериализация List<>
Пишу свой сериализатор. Дохожу до свойства List&lt;ClassName&gt;. Как мне узнать что это именно List&lt;&gt; ?...

Сериализация List<T> в строку, а не в файл
XmlSerializer XmlS = new XmlSerializer(typeof(List&lt;ListTest&gt;)); TextWriter tx = new...

8
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
24.05.2010, 16:06 2
xml скушает
0
10 / 10 / 1
Регистрация: 06.11.2009
Сообщений: 19
24.05.2010, 16:09  [ТС] 3
Лучший ответ Сообщение было отмечено как решение

Решение

Не кушает. Только что нашел как сделать. Извините за беспокойство.

Xml-сериализация сложных коллекций
Ну я надеюсь что про простую xml-сериализацию вы уже знаете Однако постоянно встает вопрос - как сериализовать классы, содержащие коллекции типа Hastable, Dictionary или Hashset (новый тип, доступный в 3-ей версии .Net Framework). Итак. Первое что нам понадобится:

using System.Runtime.Serialization;

Второе. Пометить сериализуемые классы (все! включая вложенные!) атрибутом [DataContract] и все члены класса, данные которых надо сериализовать артибутом [DataMember]:

C#
1
2
3
4
5
6
7
[DataContract]
public class MySerializableClass
{
   [DataMember]
   public Dictionary MyCollection = new Dictionary();
   ...
}
Сериализация производится следующим образом:


C#
1
2
3
4
5
6
7
8
9
10
11
public void SaveData(string path, MySerializableClass msc)
{
   XmlTextWriter xw = new XmlTextWriter(path, Encoding.UTF8);
   //а это чтобы красиво было :)
   xw.Formatting = Formatting.Indented;
   XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(xw);
   DataContractSerializer ser = new DataContractSerializer(typeof(MySerializableClass));
   ser.WriteObject(writer, ds);
   writer.Close();
   xw.Close();
}
Ну и, соответственно, десериализация:


C#
1
2
3
4
5
6
7
8
9
10
11
public MySerializableClass LoadData(string path)
{
   MySerializableClass msc = null;   using (FileStream fs = new FileStream(path, FileMode.Open))
   {
      XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null);
      DataContractSerializer ser = new DataContractSerializer(typeof(MySerializableClass));
      msc = (MySerializableClass)ser.ReadObject(reader);
   }
 
   return msc;
}
5
0 / 0 / 0
Регистрация: 19.04.2011
Сообщений: 38
19.10.2011, 20:00 4
Простите может за глупий вопрос но в этом коде
C#
1
2
3
4
5
6
7
8
9
10
11
public void SaveData(string path, MySerializableClass msc)
{
   XmlTextWriter xw = new XmlTextWriter(path, Encoding.UTF8);
   //а это чтобы красиво было :)
   xw.Formatting = Formatting.Indented;
   XmlDictionaryWriter writer = XmlDictionaryWriter.CreateDictionaryWriter(xw);
   DataContractSerializer ser = new DataContractSerializer(typeof(MySerializableClass));
   ser.WriteObject(writer, ds);
   writer.Close();
   xw.Close();
}
ds выступает как раз етим самим списком?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.10.2011, 23:04 5
Volody@, Подозреваю что там должно быть не ds, а mcs (переданный объект класса MySerializableClass).
0
19 / 34 / 11
Регистрация: 09.10.2010
Сообщений: 420
13.11.2012, 00:58 6
подключил пространство имён, но не хочет принимать [DataContract].
Error 1 Не удалось найти имя типа или пространства имен "DataContract" (пропущена директива using или ссылка на сборку?)
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
13.11.2012, 07:01 7
Гугл говорит, что DataContractAttribute находится в System.Runtime.Serialization (in System.Runtime.Serialization.dll).
Вы их подключили?
0
19 / 34 / 11
Регистрация: 09.10.2010
Сообщений: 420
14.11.2012, 06:41 8
turbanoff, Спасибо, помогло. Правда не понятно, если System.Runtime.Serialization подключается и не выдает ошибку "Не удалось найти имя типа или пространства имен "System.Runtime.Serialization"", значит и dll уже добавлена, а тут пришлось оттельно ссылку подключать.
0
Эксперт Java
4093 / 3827 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
14.11.2012, 07:05 9
Цитата Сообщение от ai-zer Посмотреть сообщение
не выдает ошибку "Не удалось найти имя типа или пространства имен "System.Runtime.Serialization"", значит и dll уже добавлена
Странные выводы вы делаете. Один и тот же namespace может использоваться (и используется) в разных сборках.
Например, в подключенной по умолчанию, системной сборке mscorlib есть класс System.Runtime.Serialization.Formatter, однако это не значит что все остальные типы из этого namespace тоже там.
1
14.11.2012, 07:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2012, 07:05
Помогаю со студенческими работами здесь

Сериализация List<string> без переноса строк
Есть класс SettingsList. Мне нужно сериализовать такое вот поле класса: private List&lt;string&gt;...

Как удалить элемент из коллекции, во время перебора этой коллекции foreach?
Прив. Смотрите что. Есть сервер, на нем 2 класса - Server &amp; ClientConnection. При подключении...

Сделать сортировку коллекции вместо создания новой коллекции с передачей IOrderedEnumerable<T>
Есть: SortableObservableCollection&lt;T&gt; using System; using System.Collections.Generic; using...

Доступ из элемента коллекции к другим элементам коллекции
Подскажите как получить данные из другого элемента коллекции? В приведенном примере необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru