今天早上我遇到了一个小问题,我担心我需要一些帮助。每次我想要序列化时,比方说,一个DataTable存储在数据库中并在检索时反序列化,我使用以下方法:
public static byte[] DatatableToByteArray(DataTable d)
{
try
{
System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(stream, d);
return stream.GetBuffer();
}
catch (Exception ex)
{
Log.WriteError(ex);
return null;
}
}
这就像一个魅力,返回的byte []很容易存储在blob
或其他类型的二进制数据库字段中。
如果我想通过TCP连接传输byte[]
,我通常会执行以下操作:
public bool SendTCP(string server, int port, string message)
{
try
{
TcpClient _tcp = new TcpClient();
_tcp.Connect(server, port);
Stream stm = _tcp.GetStream();
ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(message);
stm.Write(ba, 0, ba.Length);
//Took out the write back thingy
return true;
}
catch(Exception ex)
{
Log.Write(ex, false);
return false;
}
}
这也像魅力一样,我毫不费力地得到了我的字节。现在这是我的问题。当我混合两者时,一切都在南方。例如:
public void Mixed(string server, int port, string message)
{
try
{
//Create a datatable
DataTable dt = new DataTable();
dt.Columns.Add("TestColumn", typeof(String));
DataRow row = dt.NewRow();
row["TestColumn"] = "test";
dt.Rows.Add(row);
//Serialize it
Byte[] bb = DatatableToByteArray(dt);
//Send it over the wire
TcpClient _tcp = new TcpClient();
_tcp.Connect(server, port);
Stream stm = _tcp.GetStream();
//ASCIIEncoding asen = new ASCIIEncoding();
//byte[] ba = asen.GetBytes(message);
stm.Write(bb, 0, bb.Length);
}
catch(Exception ex)
{
Log.Write(ex, false);
}
}
当另一端对接收的字节进行反序列化时,它会报告错误:
System.Runtime.Serialization.SerializationException:二进制流'0' 不包含有效的BinaryHeader。可能的原因无效 序列化和。之间的流或对象版本更改 反序列化。在 System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run()
在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler,__BinaryParser serParser,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage)at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 serializationStream,HeaderHandler handler,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage)at GCP.Classes.Methods.ByteToDataTable(Byte [] b)in D:\ Appz \ App1 \ Classes \ Mixed.cs:第x行
我拿出了ASCIIEncoding
并试图直接在整个线路上发送序列化的DataTable,但接收方却没有。显然byte []不是byte []。我很好奇为什么。为什么ASCII编码byte[]
被完美地重新组装并且序列化byte[]
没有。
我希望有人可以对此事略有说明。我非常感谢任何意见,并提前感谢您。