Добрый день!
Сериализую обьект:
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
| System.Xml.Serialization.XmlSerializer ser =
new System.Xml.Serialization.XmlSerializer(typeof(DataSet));
DataSet dSet = new DataSet();
DataTable dTable = new DataTable();
for (int i = 0; i < dgvProduct.Columns.Count; i++)
{
//добавили колонки
dTable.Columns.Add(new DataColumn(dgvProduct.Columns[i].HeaderText));
}
for (int j = 0; j < dgvProduct.Rows.Count; j++)
{
DataRow r = dTable.NewRow();
for (int i = 0; i < dgvProduct.Columns.Count; i++)
{
if (dgvProduct.Rows[j].Cells[i].Value != null)
{
r[i] = dgvProduct.Rows[j].Cells[i].Value.ToString();
}
else
{
r[i] = "";
}
}
dTable.Rows.Add(r);
}
dSet.Tables.Add(dTable);
dgvProduct.Columns.Clear();
dgvProduct.DataSource = dSet.Tables[0];
dgvProduct.Columns[1].Width = 400; //это надо где-нить в свойствах таблицы прописать
System.IO.TextWriter tWriter = new System.IO.StreamWriter(@"C:\d.xml");
ser.Serialize(tWriter, dSet);
tWriter.Close(); |
|
Все работает=)
Отлично сериализуется, все дела
В той же программе:
я получаю данные не из обычного текстового файла, а из екселя sql-запросами:
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
| public void GetFrom(string name, System.Windows.Forms.DataGridView dgv)
{
System.Data.DataSet ds = new System.Data.DataSet();
string ConnectionString =
String.Format(
"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=No\";Data Source={0}", name);
OleDbConnection cn = new OleDbConnection(ConnectionString);
cn.Open();
// Получаем списко листов в файле
//System.Data.DataTable schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
// new object[] { null, null, null, "TABLE" });
// Берем номер листа
//string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
string select = String.Format("SELECT * FROM [{0}]", @"Заказ$");
OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);
this.Table = new System.Data.DataTable();
ad.Fill(this.Table);
dgv.DataSource = this.Table;
} |
|
считываю их в DataGV, все отлично отображается)
далее, я пытаюсь его сериализовать:
C# |
1
2
3
4
| CamIn.GetFrom(openFileDialogComeIn.FileName, dgv);
// this.Add_ComeIn(openFileDialogComeIn.FileName, folds[0]);
this.ToFolds(folds[0], openFileDialogComeIn.SafeFileName, CamIn.Table); |
|
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| System.IO.StreamWriter sW = new System.IO.StreamWriter(@"1.xml");
//System.Xml.XmlWriter wr = new System.Xml.XmlTextWriter(@"DFolders1.xml", Encoding.UTF8);
//System.IO.StreamWriter sW = new System.IO.StreamWriter(@"DFolders1.xml");
//System.IO.FileStream fS = new System.IO.FileStream(@"DFolders.xml", System.IO.FileMode.OpenOrCreate);
System.Xml.Serialization.XmlSerializer ser =
new System.Xml.Serialization.XmlSerializer(typeof(DataSet));
DataSet dSET = folds.ToData();
ser.Serialize(sW, dSET);
//bf.Serialize(fS, DFolds);//не получается сериализовать? почему?
sW.Close(); |
|
но он сериализует только названия таблиц.
Странно думаю, делаю стоп-пойнт на строчке
C# |
1
| DataSet dSET = folds.ToData(); |
|
Думаю, может они в датасете не записаны: читаю каждую строчку в Immidiat Window - все отлично, каждый элемент на своем месте
Нажимаю Ф5 - и в следующей строчке ничего не сериализуется опять, кроме названия таблиц?
Что за дела? Уже вторые сутки мучаюсь? Готов поверить в любую теорию, может DataSet не сериализует данные таблиц, которые в нем?
Добавлено через 32 минуты
Ага, для полной картины добавлю еще:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| public void ToFolds(DFolder f, string firm, DataTable _table)
{
for (int i = 0; i < _table.Rows.Count; i++)
{
DString dS = new DString();
dS.Art = Convert.ToInt32(DateTime.Today.Day.ToString() +
DateTime.Today.Month.ToString() +
DateTime.Today.Year.ToString() +
DateTime.Today.TimeOfDay.Hours.ToString()) + i;
dS.Name = Convert.ToString(_table.Rows[i].ItemArray[0]);
dS.theCount = Convert.ToInt32(_table.Rows[i].ItemArray[1]);
dS.Firstcost = Convert.ToInt32(_table.Rows[i].ItemArray[2]);
dS.Secondcost = Convert.ToInt32(_table.Rows[i].ItemArray[3]);
dS.theDate = DateTime.Today.Date;
dS.Firm = firm;
dS.ParentFolder = f;
f.Add(dS);
}
} |
|
и
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
| public System.Data.DataSet ToData()
{
System.Data.DataSet dS = new System.Data.DataSet();
for (int i = 0; i < this.Count; i++)
{
dS.Tables.Add(this[i].Name);
for (int c =0; c<6;c++)
{
dS.Tables[i].Columns.Add("Столбец" + c.ToString());
}
//создало колонки
for (int n = 0; n < this[i].Count; n++)
{
dS.Tables[i].Rows.Add(
new string[]{
(string)this[i][n].Art.ToString().Clone(),
(string)this[i][n].Name.ToString().Clone(),
(string)this[i][n].theCount.ToString().Clone(),
(string)this[i][n].Firstcost.ToString().Clone(),
(string)this[i][n].Secondcost.ToString().Clone(),
(string)this[i][n].Firm.ToString().Clone()
});
}
//создало строки
} |
|
для полной картины - это не секрет
Я уже копирую в отчаянии клон каждого стринга в Датасет, лишь бы он сериализовался. Кто может обьяснить этот полтергейст?
Добавлено через 2 часа 11 минут
Проблема разрешилась негаданно нежданно:
я смеялся долго))
Всего лишь полностью прописал путь, однако такой странной реакции сериализаторов не обьясняет