Возникла ошибка при отражении типа

pincet

1608 / 1117 / 165

Регистрация: 23.07.2010

Сообщений: 6,484

1

Возникла ошибка при отражении типа

20.11.2013, 13:51. Показов 6970. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

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
   public class TW
    {   
        [XmlAttribute]
        public string Name;
        [XmlArrayAttribute]
        public P[] Parent;
        public void ShowMe()
        {
            Console.WriteLine("{0}", Name);
            foreach (P p in Parent)
                p.ShowMe();
        }
    }
    public class P
    {
        [XmlAttribute]
        public string Name;
        [XmlAttribute]
        public string Text;
        [XmlAttribute]
        public string Type;
        [XmlAttribute]
        public string Path;
        [XmlArrayAttribute]
        public C[] Node;
        public void ShowMe()
        {
            Console.WriteLine("{0} {1} {2} {3}", Name, Text, Type, Path);
            foreach (C c in Node)
                c.ShowMe();
            
        }
    }
    public class C
    {
        [XmlAttribute]
        public string Name;
        [XmlAttribute]
        public string Text;
        public void ShowMe()
        {
            Console.WriteLine("{0} {1}",Name,Text);
        }
    }
    [Serializable]
    public class TP
    {
        [XmlAttribute]
        public string Name;
        [XmlAttribute]
        public string Descr;
        [XmlAttribute]
        public TW TreeView;
        public void ShowMe()
        {
            Console.WriteLine("{0} {1}", Name, Descr);
            TreeView.ShowMe();
        }
    }
    public class GUI
    {
        public GUI(XElement xe)
        {
            TP tp = new TP();
            XmlSerializer serializer = new XmlSerializer(typeof(TP));
            TextReader tr=new StringReader(xe.ToString());
            tp=(TP)serializer.Deserialize(tr);
            tp.ShowMe();
        }
 
    }
    class Program
    {
        static void Main(string[] args)
        {
            GUI g=new GUI(XDocument.Load("1.xml").Element("TabPage"));
        }
    }

где руки править?



0



Эксперт .NET

17230 / 12680 / 3323

Регистрация: 17.09.2011

Сообщений: 20,954

20.11.2013, 14:54

2

Лезьте в свойство InnerException до тех пор, пока оно не станет null.
Там и найдете ответ на свой вопрос.



1



pincet

1608 / 1117 / 165

Регистрация: 23.07.2010

Сообщений: 6,484

20.11.2013, 15:22

 [ТС]

3

Хм, ошибка вот здесь

C#
1
2
 [XmlAttribute]
 public TW TreeView;

XMLSerialization.TW. XmlAttribute/XmlText не может использоваться для кодирования составных типов
тепрь есть понимние, что [XmlAttribute] не умеет сериализовать составные типы
Мечталось сериализовать вот такой xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<root>
<TabPage Name="Bookin" Descr="Справочники">
  <TreeView Name="Books">
    <Parent Name="Supp" Text="Поставка" Type="Book" Path="">
      <Node Name="" Text="Поставщики" />
      <Node Name="" Text="Контрагенты" />
    </Parent>
    <Parent Name="Materials" Text="Материалы" Type="Book" Path="">
      <Node Name="" Text="Сырье" />
      <Node Name="" Text="Полуфабрикаты" />
    </Parent>
    <Parent Name="FP" Text="Готовая продукция" Type="Book" Path="">
      <Node Name="" Text="Основной" />
      <Node Name="" Text="Основные материалы" />
      <Node Name="" Text="Штрих-коды" />
    </Parent>
    <Parent Name="Others" Text="Прочее" Type="Book" Path="" />
  </TreeView>
</TabPage>
</root>

убрал [XmlAttribute]
получил

«<TabPage xmlns=»> не ожидался.»

1.ЧЯДНТ?



0



kolorotur

Эксперт .NET

17230 / 12680 / 3323

Регистрация: 17.09.2011

Сообщений: 20,954

20.11.2013, 17:20

4

Цитата
Сообщение от pincet
Посмотреть сообщение

«<TabPage xmlns=»> не ожидался.»
1.ЧЯДНТ?

У вас классы называются TW, TP и так далее, а элементы в разметке — TabPage, TreeView и т.д.

Либо называйте классы так же, как элементы в разметке, либо элементы в разметке называйте так же, как классы, либо классы пометьте атрибутом XmlType:

C#
1
2
[XmlType("TabPage")]
public class TP

Цитата
Сообщение от pincet
Посмотреть сообщение

C#
1
XDocument.Load("1.xml").Element("TabPage")

Вернет null.

C#
1
XDocument.Load("1.xml").Root.Element("TabPage")



1



pincet

1608 / 1117 / 165

Регистрация: 23.07.2010

Сообщений: 6,484

20.11.2013, 17:40

 [ТС]

5

С этим уже разобрался. Проблема в другом
XML в предыдущем посте не совсем подготовлен для десериализации.
Рабочий вот такой

XML
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
<root>
<TabPage Name="Bookin" Descr="Справочники">
  <TreeView Name="Books">
    <Parents>
      <Parent Name="Supp" Text="Поставка" Type="Book" Path="">
        <Nodes>
          <Node Name="" Text="Поставщики" />
          <Node Name="" Text="Контрагенты" />
        </Nodes>
      </Parent>
    <Parent Name="Materials" Text="Материалы" Type="Book" Path="">
      <Nodes>
      <Node Name="" Text="Сырье" />
      <Node Name="" Text="Полуфабрикаты" />
      </Nodes>
    </Parent>
    <Parent Name="FP" Text="Готовая продукция" Type="Book" Path="">
      <Nodes>
      <Node Name="" Text="Основной" />
      <Node Name="" Text="Основные материалы" />
      <Node Name="" Text="Штрих-коды" />
      </Nodes>
    </Parent>
   </Parents>
  </TreeView>
</TabPage>
</root>

т.е нужно оборачивать в доп тэги Parent и Node.
Можно ли как-то выкрутиться и десериализовать первую версию? (много софта переписывать надо)



0



    [Serializable]

            public class IPzag

            {

                public BitArray version = new BitArray(4);//номер версии 4 бита

                public BitArray header_length = new BitArray(4);//Длина заголовка 4 бита

                public BitArray toS = new BitArray(8);//тип сервиса 8 бит

                public ushort total_lenght;//Общая длина 16 бит

                public ushort identification;//Идентификатор пакета 16 бит

                public BitArray flag = new BitArray(3);//Флаги 3 бита

                public BitArray fragment_offset = new BitArray(13);//Смещение фрагмента 13 бит

                public byte ttl;//Время жизни 8 бит Time To Live

                public byte protocol;//Протокол верхнего уровня 8 бит

                public ushort checksum;//Контрольная сумма 16 бит

                public uint sourse_address;//айпишник источника 32 бита

                public uint destination_adress;//айпишник назначения 32 бита

                [DisplayName(«Номер версии»)]

                [XmlAttribute()]

                public BitArray Version

                {

                    get { return version; }

                    set { for (int i = 0; i < 4; i++) version[i] = Convert.ToBoolean(value); }

                }

                [DisplayName(«Длина заголовка»)]

                [XmlAttribute()]

                public BitArray Header_Length

                {

                    get { return header_length; }

                    set { for (int i = 0; i < 4; i++) header_length[i] = Convert.ToBoolean(value); }

                }

                [DisplayName(«Тип сервиса»)]

                [XmlAttribute()]

                public BitArray ToS

                {

                    get { return toS; }

                    set { for (int i = 0; i < 4; i++) toS[i] = Convert.ToBoolean(value); }

                }

                [DisplayName(«Общая длина»)]

                [XmlAttribute()]

                public ushort Total_lenght

                {

                    get { return total_lenght; }

                    set { total_lenght = value; }

                }

                [DisplayName(«Идентификатор пакета»)]

                [XmlAttribute()]

                public ushort Identification

                {

                    get { return identification; }

                    set { identification = value; }

                }

                [DisplayName(«Время жизни»)]

                [XmlAttribute()]

                public byte TTL

                {

                    get { return ttl; }

                    set { ttl = value; }

                }

                [DisplayName(«IP-Протокол верхнего уровня»)]

                [XmlAttribute()]

                public byte Protocol

                {

                    get { return protocol; }

                    set { protocol = value; }

                }

                [DisplayName(«Контрольная сумма»)]

                [XmlAttribute()]

                public ushort Checksum

                {

                    get { return checksum; }

                    set { checksum  = value; }

                }

                [DisplayName(«IP-адрес источника»)]

                [XmlAttribute()]

                public uint Sourse_address

                {

                    get { return sourse_address; }

                    set { sourse_address = value; }

                }

                [DisplayName(«IP-адрес назначения»)]

                [XmlAttribute()]

                public uint Destination_adress

                {

                    get { return destination_adress; }

                    set { destination_adress = value; }

                }

                [DisplayName(«Флаги»)]

                [XmlAttribute()]

                public BitArray Flag

                {

                    get { return flag; }

                    set { for (int i = 0; i < 4; i++) fragment_offset[i] = Convert.ToBoolean(value); }

                }

                [DisplayName(«Смещение фрагмента»)]

                [XmlAttribute()]

                public BitArray Fragment_offset

                {

                    get { return fragment_offset; }

                    set { for (int i = 0; i < 4; i++) fragment_offset[i] = Convert.ToBoolean(value); }

                }

                public IPzag()

            {

            }

            }

Есть класс, экземпляр которого нужно перенести в XML файл. Однако возникает исключение

Первый этап обработки исключения типа
«System.InvalidOperationException» в System.Xml.dll

Дополнительные сведения: Возникла ошибка при отражении типа
«Lab2.Model.Circle».

public class Circle:Figure2D
    {
        private double r;
        public double R
        {
            set
            {
                if (value >= 0) this.r = value;
                else throw new ArgumentNullException("Wrong radius value ( value < 0 ? ) ");
            }
            get { return r; }


        }

        public override string Save()
        {
            string s = string.Format("Circle {0} {1} {2}",this.Center.X, this.Center.Y, this.R);
            return s;

        }
        public override double P()
        {
            return 2 * Math.PI * R;
        }
        public override double S()
        {
            return Math.PI * R * R;
        }

        public static Circle LoadCircle(string s)
        {
            string[] ss = s.Split(' ');
            int x = Convert.ToInt32(ss[1]);
            int y = Convert.ToInt32(ss[2]);
            int r = Convert.ToInt32(ss[3]);

            return new Circle(new Point(x, y), r);

        }
        public override void Draw(PaintEventArgs e)
        {
            e.Graphics.DrawEllipse(new Pen(Color.Black), (int)this.Center.X, (int)this.Center.Y, (int)this.R, (int)this.R);
        }
        public override void Zoom(double K, bool isfromImage)
        {
            this.R *= K;
            if(isfromImage)
            {
                this.Center.X *= K;
                this.Center.Y *= K;
            }
            Console.WriteLine("circle zoom of {0}", this.GetType());
        }

        public override string ToString()
        {
            string baseInfo = base.ToString();
            return baseInfo + string.Format("n R: {0}n", this.R);
        }

        public Circle() { }

        public Circle(Point Center, double R) : base(Center)
        {
            this.R = R;
        }

        public Circle(Circle other) : base(other.Center)
        {
            this.R = other.R;
        }
    }

Есть у меня класс, мне нужно его сохранить в файл, в этом классе используется как свойство класс Font и он нужен,пробвал его заменить, на свой и конверировал его туда  обратно, но сериализация всё равно не работает пишет ошибку:

Возникла ошибка при отражении типа "System.Collections.Generic.List`1[WindowsFormsApplication1.MyClass]".

Этим пытался заменить:

    [Serializable]
    public class SFont
    {
        public String name { get; set; } //возвращает имя начертания этого шрифт
        public float size { get; set; } //Размер максимального пробела данного шрифта
        public Byte Style { get; set; }  //возвращает сведения о стиле данного шрифта

        /// <summary>
        /// Конструктор  класса SFont
        /// </summary>
        /// <param name="FontName">Название шрифта</param>
        /// <param name="FontSize">Размер шрифта</param>
        /// <param name="fontStyle">Стиль шрифта в Byte (нужно использовать Converter)</param>
        public SFont(String FontName, float FontSize, Byte fontStyle)
        {
            name = FontName;
            size = FontSize;
            Style = fontStyle;
        }
    }

таким классом конвертировал:

    public static class Converter
    {
        /// <summary>
        /// Конвертирует из числа от 1 до 5 в FontStyle
        /// </summary>
        /// <param name="number">число от 1 до 5</param>
        /// <returns>FontStyle</returns>
        public static FontStyle ToFontStyle(byte number)
        {
            FontStyle fs = new FontStyle();
            switch (number)
            {
                case 1: fs = FontStyle.Regular;
                    return fs;
                case 2: fs = FontStyle.Bold;
                    return fs;
                case 3: fs = FontStyle.Italic;
                    return fs;
                case 4: fs = FontStyle.Strikeout;
                    return fs;
                case 5: fs = FontStyle.Underline;
                    return fs;
            }
            return fs;
        }

        public static Byte ToNumber(FontStyle fs)
        {
            Byte i = 0;
            switch (fs)
            {
                case FontStyle.Regular: i = 1;
                    return i;
                case FontStyle.Bold: i = 2;
                    return i;
                case FontStyle.Italic: i = 3;
                    return i;
                case FontStyle.Strikeout: i = 4;
                    return i;
                case FontStyle.Underline: i = 5;
                    return i;
            }
            return i;
        }

Пример использования конвертера:

textBoxMsg.Font = new Font(MyClass.FontMsg.name, MyClass.FontMsg.size, Converter.ToFontStyle(MyClass.FontMsg.Style));
SFont sFont = new SFont(fontDialog.Font.Name, fontDialog.Font.Size, Converter.ToNumber(fontDialog.Font.Style));

Кстати в моём классе заменяющем Font видимо чегото не хватает, если кто знает подскажите, не всегда правильно сохраняет шрифт

Вот как сериализовал:

            List<MyClass> list = new List<MyClass>();
            list.Clear();
            foreach (ListViewItem item in listViewUsed.Items)
            {
                list.Add(new MyClass((MyClass)item.Tag));
            }
                XmlWriter writer = new XmlTextWriter("serialize.xml", System.Text.Encoding.UTF8);
                XmlSerializer serializer = new XmlSerializer(typeof(List<MyClass>));
                serializer.Serialize(writer, list);
                writer.Close();

Вот мне не понятно почему возникает ошибка? Я убрал из класса который нужно сериализовать вообще любое упоминание Font, даже FonStyle пришлось конвертировать, чтобы не упоминать его в своём классе и всё равно ошибка. Ничего не понимаю. Подскажите как можно сохранить в файл свой класс и потом прочесть от туда.

  • Перемещено

    1 октября 2010 г. 21:42
    MSDN Forums Consolidation (От:Visual C#)

При сереализации класса Diary:
public class Diary
{
[XmlElement]
public RichTextBox rtb { get; set; }

[XmlElement]
public DateTime dt { get; set; }

public static void Add(List list_diary,Label label1,RichTextBox richTextBox)
{
Diary diary = new Diary();
DateTime d = DateTime.Now;
DateTime.TryParse(label1.Content.ToString(),out d);
diary.dt = d;
diary.rtb = richTextBox;

//DataWorking.GetData(out list_diary, «diary.xml»);
list_diary.Add(diary);
DataWorking.WriteData(list_diary, «diary.xml»);
}
}
возникает вот такая ошибка :
9c6cbde0759a45bc821ce11ba680147d.jpg
Кто знает в чем может быть проблема?

Возможно, вам также будет интересно:

  • Возникла ошибка при отправке реестра ошибка сервера фсс
  • Возникла ошибка при отправке писем на следующие адреса электронной почты 1с
  • Возникла ошибка при отправке отчета на сервер фсрар
  • Возникла ошибка при отправке на портал ввод дпу
  • Возникла ошибка при обработке ссылки перейти на портал госуслуги

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии