Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Сериализация


Автор: Мультик 6.4.2008, 13:59
  Здравствуйте, есть проблема при сериализации объектов. Есть следующий код:

Код

        [Serializable]
        public class MyClass
           {private int x;
             private int y;
            
            public int X
               {get {return x;}
                set {x = value;}
               }
               
            public int Y
               {get {return y;}
                set {y = value;}
               }
               
            public MyClass()
               {x=5;
                y=7;
               }

            public override string ToString()
               {return x.ToString()+"; "+y.ToString();
               }
           }


Я в своём контроле создаю следующее поле:

Код

        private List <MyClass> mlist;


Делаю для него свойчтво:

Код

           [Editor(typeof(MyClassEditor), typeof(System.Drawing.Design.UITypeEditor))]
           public List<MyClass> Mlist
              {get { return mlist; }
                set { mlist = value;}
              }


MyClassEditor - редактор типа выглядит следующим образом:

Код

        //дизайнер для класса MyClass
        public class MyClassEditor: System.Drawing.Design.UITypeEditor
        {
            public override object EditValue(ITypeDescriptorContext context,
                                             IServiceProvider provider, object value)
            {
                IWindowsFormsEditorService wfes;
                wfes = (IWindowsFormsEditorService)provider.GetService(
                  typeof(IWindowsFormsEditorService));
                //создаём форму для редактирования
                glElementEditorForm newform = new glElementEditorForm();
                //пересылаем на форму наш список
                newform.mlist = new List<MyClass>((List<MyClass>)value);
                //добавляем к списку на форме ещё 1 элемент
                newform.SetMyClass();
                //показываем форму
                wfes.ShowDialog(newform);
                //пересылаем отредактированный список обратно
                return newform.mlist;
            }

            public override UITypeEditorEditStyle GetEditStyle(
              ITypeDescriptorContext context)
            {
                return UITypeEditorEditStyle.Modal;
            }
        };


После редактирования списка в редакторе, его значение сериализуется в файл ресурсов. Соответствеено для инициализации списка создаётся следующий код:

Mlist = ((System.Collections.Generic.List<MyClass>)(resources.GetObject("Mlist")));

Вроде всё работает, но после перекомпиляции проекта выдаёт следующее:

One or more errors encountered while loading the designer. The errors are listed below. Some errors can be fixed by rebuilding your project, while others may require code changes. 

Object of type 'System.Collections.Generic.List`1[glControl.glElements.MyClass]' cannot be converted to type 'System.Collections.Generic.List`1[glControl.glElements.MyClass]'. 
Hide     

at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

В чём тут весь перец?

Автор: mr.DUDA 6.4.2008, 15:12
Если просто BinaryFormatter-ом запихнуть список List<MyClass> в файл а затем восстановить из него, работает? Проблема может не в сериализации быть.

Автор: Мультик 6.4.2008, 15:34
Да нет, с BinaryFormatter все работает прекрасно. Пытался даже ручную сериализацию реализовать, но такой же результат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)