Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
IrinaSelukova
1 / 1 / 0
Регистрация: 03.10.2008
Сообщений: 7
1

Сериализация в Xml в С#

12.06.2009, 14:21. Просмотров 9282. Ответов 5
Метки нет (Все метки)

Доброе всем время суток! Нужна помощь по сериализации.
Есть несколько проблем:
1) при попытке сериализации стандартного класса Font вырабатывается исключение;
2) при сериализации класса Color (опять же стандартного) происходит следующее: программа отрабатывает, но в результирующем Xml-файле значения не появляются. Появляется только строчка типа <\MyColor> без значения;
3)проблема с подключением библиотек. Есть библиотека А, в ней описан родительский класс АА. Класс ВВ, описаный в библиотеке В, порожден от класса АА. В библиотеке В установлена ссылка на библиотеку А. Для сериализации класса ВВ необходимо указать [XmlInclude(typeof(B.BB))] перед описанием родительского класса АА. Но проблема в том, что библиотека В не видна в этом классе (и библиотеке А). Указать на нее ссылку нельзя потому, что получается кольцевая ссылка и компилятор ругается.

Подскажите, плиз, какую-нибудь информацию. Заранее всем спасибо
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2009, 14:21
Ответы с готовыми решениями:

Сериализация в xml
Имеется несколько классов следующего вида (схематично): public class A { ...

XML сериализация
Добрый день! 1. Как при сериализации XmlSerializer xmlSerializer = new...

XML сериализация списка
По какой схеме нужно сериализовать однонаправленный упорядоченный список?...

XML Сериализация. Ошибка
Пытаюсь сериализировать - Фиг Необработанное исключение типа...

XML сериализация в сетевой поток
Есть непонятная проблема с десериализацией из сетевого потока. На клиентской...

5
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
13.06.2009, 04:48 2
Лучший ответ Сообщение было отмечено как решение

Решение

1. Написать исключение лишним не было бы. Исключение возникает, т.к. класс Font не сериализуется в xml. Нужно закрыть в объекте это свойство и вместо него ввести другие свойства, которые опишут структуру шрифта.
2. Собственно тоже самое.
3. Видимо вы неверно истолковали XmlInclude. Не нужно указывать его в А. Напишите где, как и что вы хотите сериализовать.
0
IrinaSelukova
1 / 1 / 0
Регистрация: 03.10.2008
Сообщений: 7
15.06.2009, 10:55  [ТС] 3
Спасибо за подсказку. Что касательно Font, Color разобралась. Есть хорошая подсказка в MSDN. Что касательно библиотек расписываю более подробно
Есть класс

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace Monolit.VideoFrame
{
  [Serializable]
  [XmlInclude(typeof(Pump)]
  public abstract class VisualItem 
  {.....
  }
}
 
от него родился класс 
using Monolit.VideoFrame;
namespace Monolit.Armature
{
  [Serializable]
  public class Pump : VisualItem
  { ....
  }
}
Для сериализации этого класса необходимо указать перед описанием родительского класса [XmlInclude(typeof(Pump)]. Но класс Pump не виден в namespace Monolit.VideoFrame и компилятор выдает ошибку. Порожденных классов много. Те, которые находятся в namespace Monolit.VideoFrame, сериализуются без проблем при указании [XmlInclude(typeof(...)]. Но те классы, которые находятся в namespace Monolit.Armature не видны и компилятор ругается. Вот такая собственно проблема. Заранее спасибо
0
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
16.06.2009, 02:45 4
Зачем указывать XmlInclude у базового класа?
Задумайтесь, как базовый класс может сериализоваться как его потомок? Где у базового класса взять функционал потомка?
Вы не указали причину такого хода. Для чего нужно именно так сериализовать?
Предположу, что у вас возникает исключение при сериализации. В каком-то классе есть некое свойство. Тип у этого свойства VisualItem и туда вы кладете всех наследников. Так? Тогда, [XmlInclude(typeof(Pump)] вам нужно указать у этого свойства.
1
IrinaSelukova
1 / 1 / 0
Регистрация: 03.10.2008
Сообщений: 7
16.06.2009, 18:52  [ТС] 5
Здравствуйте! Может я не совсем ясно выразилась, но класс Pump является наследником VisualItem и использует при своей отрисовке все поля, описанные VisualItem. Классов, рожденных от VisualItem, достаточно большое количество и во всех описывать поля из родительского класса, получается странно. Отличаются они внутренней отрисовкой и дополнительными свойствами каждому классу.
Мне хотелось бы каким-то образом указать при описании родительского класса namespace, в котором обявлены классы-наследники. Но при указании этого [XmlInclude(typeof(Monolit.Armature.Pump))] ругается именно компилятор, поскольку не видит это namespase Monolit.Armature. До запуска дело не доходит.

Добавлено через 6 часов 51 минуту 41 секунду
Спасибо огромное! Все срослось. Нужно было только в конструкторе XmlSerializer перечислить typeof для всех необходимых классов. Всего-то. Может это и не совсем верный подход, но он работает. Еще раз спасибо
0
leonidSDF
21 / 20 / 7
Регистрация: 17.02.2011
Сообщений: 226
20.04.2011, 20:06 6
Здравствуйте, я в сериализации XML только начинающий, вы не против если я влезу со своими вопросами.
Скачал проект отсюда: mhtml:file://G:\__С__\Сериалиция XML\C#_ сериализация данных.mht

В общем код я разобрал по винтикам и почти все понял. Но есть вопрос. когда я сериализовавал Binary, там у меня был ArrayList, который я циклом поэлементно просто записывал (сериализовывал) в файл, потом закрывал поток, и все было хорошо. Здесь же создается два класса. Судя по перегрузкам сериализовываться могут только объекты. Есть ли какой ни будь способ облегчить себе жизнь. Какой смысл имея arraylist тащить его в класс, который имеет точно такой же ArrayList, то есть мне придется делать вот так:
C#
1
2
3
4
5
6
7
for (; i < massive1.count; i++)
            {
                sd.KKK.Add(new SObject(massive1[i]);
            }
 XmlWriter writer = new XmlTextWriter("serializeExample.xml", System.Text.Encoding.UTF8);
                XmlSerializer serializer = new XmlSerializer(typeof(SerializableData));
                serializer.Serialize(writer, sd);
Есть какие ни будь варианты, при наличии готового ArrayList.
0
20.04.2011, 20:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2011, 20:06

(Де)сериализация разных типов из XML
Доброго времени, форумчане! Помогите, пожалуйста, с...

Сериализация/Десериализация списка объектов в XML
имеется базовый класс Figure using System; using System.Collections.Generic;...

Сериализация каталога файлов в бинарный или xml файл
Доброго времени суток, уважаемы форумчане! Возникла такая проблема. Необходимо...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru