Application.Settings. Значение произвольного класса не сохраняется
Теперь проблема: Есть собственный класс, объявлен, как [serializable]. При вызове Application.Settings.Default.Save() в файле настроек пустое значение.
Как CLR сохраняет настройки, если тип значения - произвольный класс? Как можно отладить данный процесс в VS 2010?
Вот пример на основе DataGridView сериализируется в xml:
Описанный класс:
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;
}
}
}
}
}
{
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();
}
<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>
Итого, скорее всего механизм есть, надо еще покопать документацию.
Ну-ну. Вы бы хоть код привели, а то телепадлы сами, поди, знаете где.
Для сериализации в XML необходим открытый конструктор по умолчанию; сериализуются только rw-свойства, их типы также должны быть сериализуемыми. В принципе, можно сериализовать в двоичное представление, тогда первые два ограничения снимаются.
Ну-ну. Вы бы хоть код привели, а то телепадлы сами, поди, знаете где.
Для сериализации в XML необходим открытый конструктор по умолчанию; сериализуются только rw-свойства, их типы также должны быть сериализуемыми. В принципе, можно сериализовать в двоичное представление, тогда первые два ограничения снимаются.
Это я все уже загуглил :) Пример кода приводить не буду, т.к. ясно, что просто надо матчасть подучить. Если не поможет (а такое бывает:)), то приведу пример. А если поможет - то решение. Всем будет полезнее.
P.S. Помимо перечисленного есть еще ряд проблем с XML сериализацией, например, она не понимает Dictionary, а он мне как раз нужен. Причем, этот факт не сильно упоминается в руководствах :)