|
C# DataSet serialization
#36609084
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
добрый день...
задача:
клиент-сервер.
на сервере хранится инфа в xml файле.
слиент- виндовое приложение с датагридом.
реализовать возможность чтения и записи в файл на сервере.
написал сервак, который ждет(может, не очень красиво, но все-таки) :
*если получает сообщение "1", то отправляет данные из xml (как сериализованный DataSet)
иначе, должен десериализовать DataSet и записать в файл.
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;
}
}
клиент:
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:
1. 2. 3. 4.
Byte[] data = new Byte[ 4 ];
int recv = strm.Read(data, 0 , 4 );
int size = BitConverter.ToInt32(data, 0 );
почему-то получает неправильную инфу о размере.
хз... второй день бьюсь...
может, реализовывать иначе надо?..
|
|
|