Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Application.Settings. Значение произвольного класса не сохраняется

518
19 декабря 2012 года
Andreika
101 / / 14.02.2003
в .net есть стандартное средство сохранения настроек, так называемые settings. Значениями в настройках могут выступать любые классы.
Теперь проблема: Есть собственный класс, объявлен, как [serializable]. При вызове Application.Settings.Default.Save() в файле настроек пустое значение.
Как CLR сохраняет настройки, если тип значения - произвольный класс? Как можно отладить данный процесс в VS 2010?
392
19 декабря 2012 года
cronya
421 / / 03.01.2009
лучше использовать xml или binaryformatter сериализацию:
Вот пример на основе DataGridView сериализируется в xml:
Описанный класс:
Код:
using System.Xml.Serialization;

namespace XmlSerialization
{
    public class Window
    {
        private dataGridView nDataGridView = new dataGridView();        
        public dataGridView DataGridView
        {
            set
            {
                nDataGridView = value;
            }
            get
            {
                return nDataGridView;
            }
        }
        public class dataGridView
        {            
            public class Column
            {
                /*Members*/                
                private string nName = string.Empty;                
                private string nHeaderText = string.Empty;
                private string nColumnType = string.Empty;
                /*Properties*/
                [XmlAttribute(AttributeName = "Name")]
                public string Name
                {
                    set
                    {
                        nName = value;
                    }

                    get
                    {
                        return nName;
                    }
                }
                [XmlAttribute(AttributeName = "HeaderText")]
                public string HeaderText
                {
                    set
                    {
                        nHeaderText = value;
                    }

                    get
                    {
                        return nHeaderText;
                    }
                }
                [XmlAttribute(AttributeName = "Type")]
                public string ColumnType
                {
                    set
                    {
                        nColumnType = value;
                    }

                    get
                    {
                        return nColumnType;
                    }
                }
                /*Methods*/
            }

            private List<Column> nColumns = null;            
            public List<Column> Columns
            {
                set
                {
                    nColumns = value;
                }

                get
                {
                    return nColumns;
                }
            }        
        }          
    }
}
Сериализация и десериализация:
Код:
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            XmlSerializer xm = new XmlSerializer(typeof(Window));
            StreamWriter sw = new StreamWriter("dgv.xml");
            Window cl = new Window();
            List<Window.dataGridView.Column> dgv = new List<Window.dataGridView.Column>();
            int len = dataGridView1.Columns.Count;
            for (int idx = 0; idx < len; idx++)
            {
                Window.dataGridView.Column tmp = new Window.dataGridView.Column();
                tmp.Name = dataGridView1.Columns[idx].Name;
                tmp.HeaderText = dataGridView1.Columns[idx].HeaderText;
                tmp.ColumnType = dataGridView1.Columns[idx].GetType().Name;
                dgv.Add(tmp);
            }
            cl.DataGridView.Columns = dgv;
            xm.Serialize(sw, cl);
            sw.Close();
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            XmlSerializer xm = new XmlSerializer(typeof(Window));
            StreamReader sw = new StreamReader("dgv.xml");
            Window cl = (Window)xm.Deserialize(sw);
            int len = cl.DataGridView.Columns.Count;            
            for (int idx = 0; idx < len; idx++)
            {                
                switch (cl.DataGridView.Columns[idx].ColumnType)
                {
                    case "DataGridViewTextBoxColumn":
                        DataGridViewTextBoxColumn TBcolumn = new DataGridViewTextBoxColumn();
                        TBcolumn.Name = cl.DataGridView.Columns[idx].Name;
                        TBcolumn.HeaderText = cl.DataGridView.Columns[idx].HeaderText;
                        dataGridView1.Columns.Add(TBcolumn);
                        break;
                    case "DataGridViewImageColumn":
                        DataGridViewImageColumn Icolumn = new DataGridViewImageColumn();
                        Icolumn.Name = cl.DataGridView.Columns[idx].Name;
                        Icolumn.HeaderText = cl.DataGridView.Columns[idx].HeaderText;
                        dataGridView1.Columns.Add(Icolumn);
                        break;
                    case "DataGridViewCheckBoxColumn":
                        DataGridViewCheckBoxColumn CBcolumn = new DataGridViewCheckBoxColumn();
                        CBcolumn.Name = cl.DataGridView.Columns[idx].Name;
                        CBcolumn.HeaderText = cl.DataGridView.Columns[idx].HeaderText;
                        dataGridView1.Columns.Add(CBcolumn);
                        break;
                    case "DataGridViewComboBoxColumn":
                        DataGridViewComboBoxColumn CoBcolumn = new DataGridViewComboBoxColumn();
                        CoBcolumn.Name = cl.DataGridView.Columns[idx].Name;
                        CoBcolumn.HeaderText = cl.DataGridView.Columns[idx].HeaderText;
                        dataGridView1.Columns.Add(CoBcolumn);
                        break;
                    default:
                        break;
                }
            }            
            sw.Close();
        }
Результат:
 
Код:
<?xml version="1.0" encoding="utf-8"?>
<Window xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DataGridView>
    <Columns>
      <Column Name="Column1" HeaderText="ID" Type="DataGridViewTextBoxColumn" />
      <Column Name="Column2" HeaderText="Name" Type="DataGridViewTextBoxColumn" />
      <Column Name="Column3" HeaderText="SureName" Type="DataGridViewComboBoxColumn" />
    </Columns>
  </DataGridView>
</Window>
518
19 декабря 2012 года
Andreika
101 / / 14.02.2003
Хотелось поменьше предпринимать телодвижений. Класс настроек сохраняет произвольные типы, и уже автоматом сериализует их в XML. Но почему-то мой объект сериализовывать не хочет, вернее хочет, но как пустое значение.
Итого, скорее всего механизм есть, надо еще покопать документацию.
392
19 декабря 2012 года
cronya
421 / / 03.01.2009
ну если что нароете, поделитесь :), тоже как то интересно, я пока что в мдсн нашел только это сюда но я не думаю что это более менее короче
341
20 декабря 2012 года
Der Meister
874 / / 21.12.2007
Цитата: Andreika
Хотелось поменьше предпринимать телодвижений.

Ну-ну. Вы бы хоть код привели, а то телепадлы сами, поди, знаете где.
Для сериализации в XML необходим открытый конструктор по умолчанию; сериализуются только rw-свойства, их типы также должны быть сериализуемыми. В принципе, можно сериализовать в двоичное представление, тогда первые два ограничения снимаются.

518
20 декабря 2012 года
Andreika
101 / / 14.02.2003
Цитата: Der Meister
Цитата: Andreika
Хотелось поменьше предпринимать телодвижений.

Ну-ну. Вы бы хоть код привели, а то телепадлы сами, поди, знаете где.
Для сериализации в XML необходим открытый конструктор по умолчанию; сериализуются только rw-свойства, их типы также должны быть сериализуемыми. В принципе, можно сериализовать в двоичное представление, тогда первые два ограничения снимаются.



Это я все уже загуглил :) Пример кода приводить не буду, т.к. ясно, что просто надо матчасть подучить. Если не поможет (а такое бывает:)), то приведу пример. А если поможет - то решение. Всем будет полезнее.

P.S. Помимо перечисленного есть еще ряд проблем с XML сериализацией, например, она не понимает Dictionary, а он мне как раз нужен. Причем, этот факт не сильно упоминается в руководствах :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог