Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
DCNick3
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
1

XML Сериализация. Ошибка

01.06.2015, 00:08. Просмотров 2706. Ответов 2
Метки нет (Все метки)

Пытаюсь сериализировать - Фиг
Exception
Необработанное исключение типа "System.InvalidOperationException" в System.Xml.dll

Дополнительные сведения: Ошибка при создании документа XML.

Привожу классы:
Class'ы
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[Serializable()]
    public class Scene
    {
        public static Scene Load(string file)
        {
            Stream loadStream = File.Open(file, FileMode.Open);
            XmlSerializer serializer = new XmlSerializer(typeof(Scene));
            return (Scene)serializer.Deserialize(loadStream);
        }
 
        internal static void Save(string file, Scene obj)
        {
            Stream saveStream = File.Open(file, FileMode.Create);
            XmlSerializer serializer = new XmlSerializer(typeof(Scene));
            serializer.Serialize(saveStream, obj);
        }
 
        public void Draw(SpriteBatch spriteBatch)
        {
            foreach (var element in elements)
                element.Draw(spriteBatch);
        }
 
        public SceneElement[] elements = new SceneElement[] { };
    }
 
    [Serializable()]
    public abstract class SceneElement
    {
        public int posX;
        public int posY;
        public bool isDrawOriginInCenter;
        public Color color;
        public float rotation;
 
        public abstract void Draw(SpriteBatch spriteBatch);
    }
 
    [Serializable()]
    public class SceneElementImage : SceneElement
    {
        public string texture;
        public int targetHeight;
        public int targetWidth;
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            Texture2D ttexture = ContentRegistry.textureRegistry[texture];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = new Vector2(targetWidth, targetHeight) / 2.0F;
 
            spriteBatch.Draw(ttexture, new Rectangle(posX, posY, targetWidth, targetHeight), null, color, rotation, origin, SpriteEffects.None, 0);
        }
    }
 
    [Serializable()]
    public class SceneElementLabel : SceneElement
    {
        public string text;
        public string font;
        
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            SpriteFont sFont = ContentRegistry.spriteFontRegistry[font];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = sFont.MeasureString(text) / 2.0F;
 
            spriteBatch.DrawString(sFont, text, new Vector2(posX, posY), color, rotation, origin, 1, SpriteEffects.None, 0);
        }
    }


Может проблема в абстрактах... Кароч выручайте, как можно изменить.
На эти классы сильно ничего не завязано, т.ч. можно менять (без потери возможностей).
Вот.

P.S. BinaryFormatter не пойдёт, ибо фалы человеки писать будут (в основном будем их читать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2015, 00:08
Ответы с готовыми решениями:

Сериализация в Xml в С#
Доброе всем время суток! Нужна помощь по сериализации. Есть несколько...

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

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

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

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

2
Someone007
2375 / 1864 / 854
Регистрация: 09.05.2015
Сообщений: 4,610
Завершенные тесты: 1
01.06.2015, 04:33 2
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    [Serializable]
    public class Scene
    {
        public static Scene Load(string file)
        {
            using (Stream loadStream = File.Open(file, FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Scene));
                return (Scene)serializer.Deserialize(loadStream);
            }
        }
 
        internal static void Save(string file, Scene obj)
        {
            using (Stream saveStream = File.Open(file, FileMode.Create))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Scene));
                serializer.Serialize(saveStream, obj);
            }
        }
 
        public void Draw(SpriteBatch spriteBatch)
        {
            foreach (var element in elements)
                element.Draw(spriteBatch);
        }
 
        public List<SceneElement> elements = new List<SceneElement>();
    }
 
    [Serializable]
    [XmlInclude(typeof(SceneElementImage))]
    [XmlInclude(typeof(SceneElementLabel))]
    public abstract class SceneElement
    {
        public int posX;
        public int posY;
        public bool isDrawOriginInCenter;
        public Color color;
        public float rotation;
 
        public abstract void Draw(SpriteBatch spriteBatch);
    }
 
    [Serializable]
    public class SceneElementImage : SceneElement
    {
        public string texture;
        public int targetHeight;
        public int targetWidth;
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            Texture2D ttexture = ContentRegistry.textureRegistry[texture];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = new Vector2(targetWidth, targetHeight) / 2.0F;
 
            spriteBatch.Draw(ttexture, new Rectangle(posX, posY, targetWidth, targetHeight), null, color, rotation, origin, SpriteEffects.None, 0);
        }
    }
 
    [Serializable]
    public class SceneElementLabel : SceneElement
    {
        public string text;
        public string font;
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            SpriteFont sFont = ContentRegistry.spriteFontRegistry[font];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = sFont.MeasureString(text) / 2.0F;
 
            spriteBatch.DrawString(sFont, text, new Vector2(posX, posY), color, rotation, origin, 1, SpriteEffects.None, 0);
        }
    }
C#
1
2
3
4
5
6
7
8
                Scene s = new Scene();
 
                s.elements.Add(new SceneElementImage());
                s.elements.Add(new SceneElementLabel());
 
                Scene.Save("test.scene", s);
 
                var s2 = Scene.Load("test.scene");
0
DCNick3
4 / 4 / 6
Регистрация: 03.05.2014
Сообщений: 101
01.06.2015, 21:58  [ТС] 3
Сериализую так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
            SceneElementLabel label = new SceneElementLabel();
            label.text = "Загрузка ...";
            label.posX = 960;
            label.posY = 720;
            label.isDrawOriginInCenter = true;
            label.font = "verdana48";
            label.color = Color.White;
            loadingScene.elements.Add(label);
            Scene.Save("loadingScene.xml", loadingScene);
 
 
            //Где-то ранее
            Scene loadingScene = new Scene();
Добавлено через 3 минуты
Таааак! Раздобыл еще сведений об исключении:
More DATA

System.InvalidOperationException не обработано
HResult=-2146233079
Message=Ошибка при создании документа XML.
Source=System.Xml
StackTrace:
в System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
в System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
в System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
в MyVisualNovelLanguage.Scene.Save(String file, Scene obj) в C:\Users\Никита\documents\visual studio 2015\Projects\MVNL\MVNL\MVNL\MVNL\Scene.cs:строка 26
в MyVisualNovelLanguage.Game1.Initialize() в C:\Users\Никита\documents\visual studio 2015\Projects\MVNL\MVNL\MVNL\MVNL\Game1.cs:строка 137
в Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun)
в Microsoft.Xna.Framework.Game.Run()
в MyVisualNovelLanguage.Program.Main(String[] args) в C:\Users\Никита\documents\visual studio 2015\Projects\MVNL\MVNL\MVNL\MVNL\Program.cs:строка 20
InnerException:
HResult=-2146233079
Message=Тип MyVisualNovelLanguage.SceneElementLabel не ожидался. Используйте атрибут XmlInclude или SoapInclude для задания типов, которые не известны как статические.
Source=Microsoft.GeneratedCode
StackTrace:
в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterScene.Write3_SceneElement(String n, String ns, SceneElement o, Boolean isNullable, Boolean needType)
в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterScene.Write4_Scene(String n, String ns, Scene o, Boolean isNullable, Boolean needType)
в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterScene.Write5_Scene(Object o)
InnerException:


Добавлено через 15 минут
РЕШЕНО:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
[Serializable(), XmlInclude(typeof(SceneElementLabel)), XmlInclude(typeof(SceneElementImage))]
    public class Scene
    {
        public Scene() { }
 
        public static Scene Load(string file)
        {
            Stream loadStream = File.Open(file, FileMode.Open);
            XmlSerializer serializer = new XmlSerializer(typeof(Scene));
            return (Scene)serializer.Deserialize(loadStream);
        }
 
        internal static void Save(string file, Scene obj)
        {
            StreamWriter saveStream = new StreamWriter("scene.xml", false);
            XmlSerializer serializer = new XmlSerializer(typeof(Scene));
            serializer.Serialize(saveStream, obj);
        }
 
        public void Draw(SpriteBatch spriteBatch)
        {
            foreach (var element in elements)
                element.Draw(spriteBatch);
        }
 
        public List<SceneElement> elements = new List<SceneElement>();
    }
 
    [Serializable()]
    public abstract class SceneElement
    {
        public SceneElement() { }
        public int posX;
        public int posY;
        public bool isDrawOriginInCenter;
        public Color color;
        public float rotation;
 
        public abstract void Draw(SpriteBatch spriteBatch);
    }
 
    [Serializable()]
    public class SceneElementImage : SceneElement
    {
        public SceneElementImage() { }
        public string texture;
        public int targetHeight;
        public int targetWidth;
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            Texture2D ttexture = ContentRegistry.textureRegistry[texture];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = new Vector2(targetWidth, targetHeight) / 2.0F;
 
            spriteBatch.Draw(ttexture, new Rectangle(posX, posY, targetWidth, targetHeight), null, color, rotation, origin, SpriteEffects.None, 0);
        }
    }
 
    [Serializable()]
    public class SceneElementLabel : SceneElement
    {
        public SceneElementLabel() { }
        public string text;
        public string font;
        
 
        public override void Draw(SpriteBatch spriteBatch)
        {
            SpriteFont sFont = ContentRegistry.spriteFontRegistry[font];
            Vector2 origin = Vector2.Zero;
            if (isDrawOriginInCenter)
                origin = sFont.MeasureString(text) / 2.0F;
 
            spriteBatch.DrawString(sFont, text, new Vector2(posX, posY), color, rotation, origin, 1, SpriteEffects.None, 0);
        }
    }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2015, 21:58

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

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

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


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

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

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