powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# DataSet serialization
1 сообщений из 1, страница 1 из 1
C# DataSet serialization
    #36609084
super___man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день...

задача:
клиент-сервер.
на сервере хранится инфа в xml файле.
слиент- виндовое приложение с датагридом.
реализовать возможность чтения и записи в файл на сервере.

написал сервак, который ждет(может, не очень красиво, но все-таки) :
*если получает сообщение "1", то отправляет данные из xml (как сериализованный DataSet)
иначе, должен десериализовать DataSet и записать в файл.

Код: plaintext
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.
165.
166.
167.
168.
169.
170.
171.
172.
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Runtime.Serialization;
using System.Reflection;
using System.Data;
using System.Runtime.Serialization.Formatters.Soap;

class MyTcpListener
{

    private static void SendData(NetworkStream strm, DataSet emp)
    {
        SoapFormatter formatter = new SoapFormatter();
        formatter.Binder = new AssemblySerializationBinder(AppDomain.CurrentDomain.GetAssemblies());
        MemoryStream memstrm = new MemoryStream();

        formatter.Serialize(memstrm, emp);
        byte[] data = memstrm.GetBuffer();
        int memsize = (int)memstrm.Length;
        byte[] size = BitConverter.GetBytes(memsize);
        strm.Write(size,  0 ,  4 );
        strm.Write(data,  0 , memsize);
        strm.Flush();
    
        memstrm.Close();
    }

    private static DataSet RecvData(NetworkStream strm)
    {
        // = new DataSet();

        MemoryStream memstrm = new MemoryStream();
        Byte[] data = new Byte[ 4 ];
        int recv = strm.Read(data,  0 ,  4 );
   
        int size = BitConverter.ToInt32(data,  0 );
        int offset =  0 ;
        while (size >  0 )
        {
            data = new Byte[ 6500 ];
            recv = strm.Read(data,  0 , size);
            memstrm.Write(data, offset, recv);
            offset += recv;
            size -= recv;
        }
        SoapFormatter formatter = new SoapFormatter();
        formatter.Binder = new AssemblySerializationBinder(AppDomain.CurrentDomain.GetAssemblies());
      
        memstrm.Seek( 0 , SeekOrigin.Begin);
        DataSet ds = (DataSet)formatter.Deserialize(memstrm);
     
        memstrm.Close();
        return ds;
    }     

    public static void Main()
    {
        TcpListener server = null;
        try
        {
            // Set the TcpListener on port  13000 .
            Int32 port =  13000 ;
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");

            // TcpListener server = new TcpListener(port);
            server = new TcpListener(localAddr, port);

            // Start listening for client requests.
            server.Start();

            // Buffer for reading data
            Byte[] bytes = new Byte[ 6500 ];
            String data = null;
            NetworkStream stream;
            TcpClient client;
            // Enter the listening loop.
            while (true)
            {
                Console.Write("Waiting for a connection... ");

                // Perform a blocking call to accept requests.
                // You could also user server.AcceptSocket() here.
                client = server.AcceptTcpClient();

                Console.WriteLine("Connected!");

                data = null;

                // Get a stream object for reading and writing
                stream= client.GetStream();
                int i= 0 ;
                i = stream.Read(bytes,  0 , bytes.Length);
                // Loop to receive all the data sent by the client.
               // while ((i = stream.Read(bytes,  0 , bytes.Length)) !=  0 )
              //  {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes,  0 , i);
                    if (data.Equals("1"))
                    {

                        /*********************************/
                        DataSet ds = new DataSet();
                        ds.ReadXml("Students.xml", XmlReadMode.InferSchema);
                        stream = client.GetStream();
                        SendData(stream, ds);

                      //  strm.Close();
                        
                        /*********************************/
                      

                        // Send back a response.
                      //  stream.Write(msg,  0 , msg.Length);
                    }
                    else
                    {
                        NetworkStream streamr = client.GetStream();
                        DataSet ds=RecvData(streamr);
                        ds.WriteXml("Students_O.xml", XmlWriteMode.IgnoreSchema);
                      
                    }
                
            }
                // Shutdown and end connection
                stream.Close();
                client.Close();
            
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {
            // Stop listening for new clients.
            server.Stop();
        }


        Console.WriteLine("\nHit enter to continue...");
        Console.Read();
    }
}

internal class AssemblySerializationBinder : SerializationBinder
{
    private Assembly[] availableAssemblies;

    public AssemblySerializationBinder(Assembly[] availableAssemblies)
    {
        this.availableAssemblies = availableAssemblies;
    }

    public override Type BindToType(System.String assemblyName, System.String typeName)
    {
        for (int i =  0 ; i < availableAssemblies.Length; i++)
        {
            Type[] types = availableAssemblies[i].GetTypes();
            for (int j =  0 ; j < types.Length; j++)
            {
                if (types[j].FullName == typeName)
                    return types[j];
            }
        }
        return null;
    }
}



клиент:
Код: plaintext
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.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
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.Runtime.Serialization;
using System.Reflection;
using System.Net.Sockets;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

namespace Client6_win
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
        private void button2_Click(object sender, EventArgs e)
        {
            DataSet ds = (DataSet)dataGridStudents.DataSource;
           // ds.WriteXml("Students_O.xml", XmlWriteMode.IgnoreSchema);    
            Connect("localhost", "1");
         //   Update("localhost", ds);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Connect("localhost", "1");
        }

        private static void SendData(NetworkStream strm, DataSet ds)
        {
            SoapFormatter formatter = new SoapFormatter();
            formatter.Binder = new AssemblySerializationBinder(AppDomain.CurrentDomain.GetAssemblies());
            MemoryStream memstrm = new MemoryStream();

            formatter.Serialize(memstrm, ds);
            byte[] data = memstrm.GetBuffer();
            int memsize = (int)memstrm.Length;
            byte[] size = BitConverter.GetBytes(memsize);
            strm.Write(size,  0 ,  4 );
            strm.Write(data,  0 , memsize);
            strm.Flush();
            strm.Close();
            memstrm.Close();
        }


        private static DataSet RecvData(NetworkStream strm)
        {
            // = new DataSet();
            MemoryStream memstrm = new MemoryStream();
            byte[] data = new byte[ 4 ];
            int recv = strm.Read(data,  0 ,  4 );
            int size = BitConverter.ToInt32(data,  0 );
            int offset =  0 ;
            while (size >  0 )
            {
                data = new byte[ 6500 ];
                recv = strm.Read(data,  0 , size);
                memstrm.Write(data, offset, recv);
                offset += recv;
                size -= recv;
            }
            SoapFormatter formatter = new SoapFormatter();
            formatter.Binder = new AssemblySerializationBinder(AppDomain.CurrentDomain.GetAssemblies());
            //  memstrm.Position =  0 ;
            //  memstrm = GetMemoryStreamFromString((GetStringFromMemoryStream(memstrm).Trim()));
            memstrm.Seek( 0 , SeekOrigin.Begin);
            DataSet ds = (DataSet)formatter.Deserialize(memstrm);
            memstrm.Close();
            return ds;
        }     


        public void Connect(String server, String message)
        {
                      
                // Create a TcpClient.
                // Note, for this client to work you need to have a TcpServer 
                // connected to the same address as specified by the server, port
                // combination.
                Int32 port =  13000 ;
                TcpClient client = new TcpClient(server, port);
                NetworkStream stream = client.GetStream();
      
                    // Translate the passed message into ASCII and store it as a Byte array.
                    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

                    // Get a client stream for reading and writing.
                    //  Stream stream = client.GetStream();

                    stream = client.GetStream();

                    // Send the message to the connected TcpServer. 
                    stream.Write(data,  0 , data.Length);

                                    // Receive the TcpServer.response.

                    // Buffer to store the response bytes.
                    data = new Byte[ 6500 ];
                   

                        DataSet ds = RecvData(stream);
                        this.dataGridStudents.SetDataBinding(ds, "student");
                 //       responseData = ds.GetXml();
         
                   
              
                // Close everything.
                stream.Close();
                client.Close();
            }





        public void Update(String server, DataSet ds)
        {

            // Create a TcpClient.
            // Note, for this client to work you need to have a TcpServer 
            // connected to the same address as specified by the server, port
            // combination.
            Int32 port =  13000 ;
            TcpClient client = new TcpClient(server, port);
            NetworkStream stream = client.GetStream();

            // Translate the passed message into ASCII and store it as a Byte array.
           // Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

            // Get a client stream for reading and writing.
            //  Stream stream = client.GetStream();
             
            stream = client.GetStream();
            
            SendData(stream, ds);
            // Send the message to the connected TcpServer. 
         //   stream.Write(data,  0 , data.Length);

        
            // Close everything.
            stream.Close();
            client.Close();
        }


    }

    }


internal class AssemblySerializationBinder : SerializationBinder
{
    private Assembly[] availableAssemblies;

    public AssemblySerializationBinder(Assembly[] availableAssemblies)
    {
        this.availableAssemblies = availableAssemblies;
    }

    public override Type BindToType(System.String assemblyName, System.String typeName)
    {
        for (int i =  0 ; i < availableAssemblies.Length; i++)
        {
            Type[] types = availableAssemblies[i].GetTypes();
            for (int j =  0 ; j < types.Length; j++)
            {
                if (types[j].FullName == typeName)
                    return types[j];
            }
        }
        return null;
    }
}
клиент нормально получает и десериализует DataSet, но когда он отправляет, то size:
Код: plaintext
1.
2.
3.
4.
Byte[] data = new Byte[ 4 ];
        int recv = strm.Read(data,  0 ,  4 );
   
        int size = BitConverter.ToInt32(data,  0 );
почему-то получает неправильную инфу о размере.

хз... второй день бьюсь...
может, реализовывать иначе надо?..
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# DataSet serialization
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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