powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сериализация DataTable C#
23 сообщений из 23, страница 1 из 1
Сериализация DataTable C#
    #38253585
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!

А кто знает, существует ли НЕ XML сериализация DataTable и как ее сделать???
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253591
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробую так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public byte[] SerializeData(Object o)
 {
 MemoryStream ms = new MemoryStream();
 BinaryFormatter bf1 = new BinaryFormatter();
 bf1.Serialize(ms, o);
 return ms.ToArray();
 }

public object DeserializeData(byte[] theByteArray)
 {
 MemoryStream ms = new MemoryStream(theByteArray);
 BinaryFormatter bf1 = new BinaryFormatter();
 ms.Position = 0;
 return bf1.Deserialize(ms);
 }
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253674
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так: http://codearticles.ru/articles/2276
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253701
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПопробуй так: http://codearticles.ru/articles/2276
смотрю! спасибо!
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253716
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, тебе же не в xml надо. Так а BinaryFormatter не работает?
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253728
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСорри, тебе же не в xml надо. Так а BinaryFormatter не работает?
ни в какую - ошибку выдает и все:

Код: 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.
Byte[] sendBytes = null;
...
            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    OpenSQL(dataFromClient);
                    // Отправка table клиенту
                    sendBytes= SerializeData(table);
                    //sendBytes = Encoding.ASCII.GetBytes("12345");
                    
                    // rCount = Convert.ToString(requestCount);
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();
                    Console.WriteLine(" >> " + serverResponse);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(" >> " + ex.ToString());
                }
            }
        }


   public byte[] SerializeData(Object o)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf1 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf1.Serialize(ms, o);
            return ms.ToArray();
        }
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253731
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выдал ошибку Первый этап обработки исключения типа "System.ArgumentNullException" в приложении System.dll
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 public DataTable DeserializeData(byte[] theByteArray)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream(theByteArray);
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf1 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            ms.Position = 0;
            return (DataTable) bf1.Deserialize(ms);
        }
        



вот эта строка и причина ошибки
Код: c#
1.
serverStream.Read(ReceivedBytes, 0, (int)clientSocket.ReceiveBufferSize);
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253735
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если массив заранее нужного размер создаю, то ошибка не возникает
но он и не может десериализовать полученный объект
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253736
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
            Byte[] ReceivedBytes = null;
           // byte[] ReceivedBytes = new byte[20000];
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253737
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сишарп еще жутко плохо знаю вот и завис
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253739
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может дело в массивах?
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253742
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот в отладке проверил - объект сериазизуется в массив
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253764
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подправил, ошибки исчезли но Grid так и остается без данных, хотя вроде DataTable десериализуется
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253788
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75,

вот пример точно работающей сериализации
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class LIBRA
{
.....
void SAVE()
{
            IFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MyMemoryStream();
            bf.Serialize(ms, this);
            ms.SaveToFile("ddd");
}
static LIBRA LOAD()
{
                IFormatter bf = new BinaryFormatter();
                MemoryStream ms = MyMemoryStream.ReadFromFile("ddd");
                if (ms.Length == 0) return null;
                LIBRA  lib = (LIBRA)bf.Deserialize(ms);
                return lib;
}
}



а....это тот проект для студента. TCP+Serialization
смотри , что там прилетает в сокет. сохрани на винт. мож там что не так.
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253807
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erGaladriel75,

вот пример точно работающей сериализации
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class LIBRA
{
.....
void SAVE()
{
            IFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MyMemoryStream();
            bf.Serialize(ms, this);
            ms.SaveToFile("ddd");
}
static LIBRA LOAD()
{
                IFormatter bf = new BinaryFormatter();
                MemoryStream ms = MyMemoryStream.ReadFromFile("ddd");
                if (ms.Length == 0) return null;
                LIBRA  lib = (LIBRA)bf.Deserialize(ms);
                return lib;
}
}



а....это тот проект для студента. TCP+Serialization
смотри , что там прилетает в сокет. сохрани на винт. мож там что не так.

спасибо! попробую!
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253936
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура!!! я родил наконец-то!!!
Датасет сериализовал, дататабле - ни в какую
а может где ошибся, потом покопаю
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38253944
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Galadriel75,

Свойство TableName в DataTable было проинициализировано? Возможно в этом причина.
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38254206
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSVGaladriel75,

Свойство TableName в DataTable было проинициализировано? Возможно в этом причина.
перед тем, как все начинать, я проверил - скормил гриду заполненный DataTable и грид показал инфу...
потом я начал этот DataTable передавать по сокетам - грид молчал...
Тогда я DataTable обернул DataSet и в сокетах передал DataSet то есть DataTable почему-то нормально разобрался собрался только внутри контейнера или я может где напортачил... потом посмотрю, как отдам курсач студенту...

судя по всему - объект в памяти хранится не в смежных байтах, поэтому так просто эти байты не вольеш в поток, я начитался про непокорность и нежелание DataTable разбираться на кусочки, но все еще склонен думать, что DataTable здесь ни причем, а косяк исключительно мой...
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38254207
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чуть позже наведу порядок в коде и выложу его здесь - мне помогали, может и мой код кому пригодится!
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #38254409
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот прототип (рабочий) складывается такой

Сервер

Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
using System;
using System.Threading;
using System.Net.Sockets;
using System.Text;
using System.Data.Common;
using System.Data.OleDb;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener serverSocket = new TcpListener(8888);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;
            serverSocket.Start();
            Console.WriteLine(" >> " + "Server Started");
            while (true)
            {
                counter ++;
                clientSocket = serverSocket.AcceptTcpClient();
                Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " connected!");
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }
            clientSocket.Close();
            serverSocket.Stop();
            Console.WriteLine(" >> " + "exit");
            Console.ReadLine();
        }
    }

    public class handleClinet
    {
        public String connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.IO.Path.GetFullPath("base.mdb") + @";";
        public    OleDbCommand cmd;
        public    OleDbConnection MDBConn;
        DataTable table = new DataTable();
        public DataSet ds = new DataSet();
        public OleDbDataAdapter da; 
        TcpClient clientSocket;
        string clNo;
        public byte[] SerializeData(DataTable table)
        {
            byte[] data = null;
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf1 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf1.Serialize(ms, table);
            data = ms.ToArray();
            ms.Close();
            ms.Dispose();
            return data;
        }

        public byte[] SerializeData(DataSet table)
        {
            byte[] data = null;
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf1 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf1.Serialize(ms, table);
            data = ms.ToArray();
            ms.Close();
            ms.Dispose();
            return data;
        }
       public void startClient(TcpClient inClientSocket, string clineNo)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }
        private void doChat()
        {
            int requestCount = 0;
            string dataFromClient = null;
            string serverResponse = null;
            requestCount = 0;
            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream Stream = clientSocket.GetStream();
                    int size  = (int)clientSocket.ReceiveBufferSize;
                    byte[] bytesFrom = new byte[size];
                    Stream.Read(bytesFrom, 0, size);
                    dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                    Console.WriteLine(" >> " + "From client-" + clNo + dataFromClient);
                    OpenSQLx(dataFromClient);
                    // Отправка table клиенту
                    Stream.Write(SerializeData(ds), 0, SerializeData(ds).Length);
                    //Stream.Write(SerializeData(table), 0, SerializeData(table).Length);
                    Stream.Flush();
                //  sendBytes = Encoding.ASCII.GetBytes("12345");
                    // rCount = Convert.ToString(requestCount);
                   // serverResponse = "Server to clinet(" + clNo + ") " + rCount;
                   // sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                    Console.WriteLine(" >> " + serverResponse);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(" >> " + ex.ToString());
                }
            }
        }
    private void OpenSQL(String _sql)
    {
        MDBConn = new OleDbConnection(connectionString); 
        try // Открываем соединение 
         {
            MDBConn.Open();
            ds.DataSetName = "LocalDataBase";
            table.TableName = "sprContragents";
            ds.Tables.Clear();
            ds.Tables.Add(table);
            using (da = new OleDbDataAdapter(_sql, MDBConn))
            {
                da.Fill(ds);
                ds.WriteXml(@"bbb.xml");
            }
          }
               catch (Exception ex)
               {
                   Console.WriteLine(" >> " + ex.ToString());
               }
             
               finally // Закрываем соединение 
               {
                  MDBConn.Close();
               }
            //======================================= 
        }
    private void OpenSQLx(String _sql)
    {
        MDBConn = new OleDbConnection(connectionString);
        try // Открываем соединение 
        {
            MDBConn.Open();
            ds.DataSetName = "LocalDataBase";
            table.TableName = "sprContragents";
            ds.Tables.Clear();
            ds.Tables.Add(table);
            using (da = new OleDbDataAdapter(_sql, MDBConn))
            {
                da.Fill(table);
                ds.WriteXml(@"bbb.xml");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(" >> " + ex.ToString());
        }
               finally // Закрываем соединение 
        {
            MDBConn.Close();
        }
        //======================================= 
    }
  }
}




Клиент

Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;
using System.Data.OleDb;
using System.Net.Sockets;
namespace Shop
{
    public partial class FormSpr : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        public String connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FormMain.dblocation + @";";
        public    OleDbCommand cmd;
        public    OleDbConnection MDBConn;
        DataTable table = new DataTable();
        private String  _sql = "";
        public OleDbDataAdapter da; 
        public String SQL
        {
            get
            {
                return _sql;
            }

            set
            {
                _sql = value;
            }
        }
        public FormSpr()
        {
            InitializeComponent();
        }
        public DataSet DeserializeData(byte[] theByteArray)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream(theByteArray);
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf1 = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            ms.Position = 0;
            return (DataSet) bf1.Deserialize(ms);
        }
    
        private void SetupDataGridView(DataGridView dgv)
        {
            dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.Navy;
            dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
            dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
            dgv.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
            dgv.CellBorderStyle = DataGridViewCellBorderStyle.Single;
            dgv.GridColor = Color.Black;
            dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgv.MultiSelect = false;
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }

        private void FormSpr_Load(object sender, EventArgs e)
        {

            try
            {
                clientSocket.Connect("127.0.0.1", 8888);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка!\n\n" + ex.Message, "Ошибка SQL", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            MDBConn = new OleDbConnection(connectionString);
            SetupDataGridView(dataGridView1);
            NetworkStream Stream = clientSocket.GetStream();
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(_sql+"$");
            Stream.Write(outStream, 0, outStream.Length);
            Stream.Flush();
            Stream = clientSocket.GetStream();
            int size = (int)clientSocket.ReceiveBufferSize;
            byte[] ReceivedBytes = new byte[size];
            Stream.Read(ReceivedBytes, 0, size);
            DataSet data = DeserializeData(ReceivedBytes);
            data.WriteXml(@"aaa");
            dataGridView1.DataSource = data.Tables[0].DefaultView; 
        }
            
        private void FormSpr_FormClosed(object sender, FormClosedEventArgs e)
        {
           // da.Update(table);
           // MDBConn.Close();
        }
          
        } 
    }


...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сериализация DataTable C#
    #39185993
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А типы колонок восстановились корректно?
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #39186002
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Macks,
А разве нет?
...
Рейтинг: 0 / 0
Сериализация DataTable C#
    #39186490
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВMacks,
А разве нет?


dt.Columns[0].ExtendedProperties.Add("type", "2");

если сделать так, то нет.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сериализация DataTable C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]