序列化字节和ASCII字节之间的差异

时间:2017-08-23 07:36:41

标签: c# arrays serialization

今天早上我遇到了一个小问题,我担心我需要一些帮助。每次我想要序列化时,比方说,一个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[]没有。

我希望有人可以对此事略有说明。我非常感谢任何意见,并提前感谢您。

0 个答案:

没有答案