如何序列化一个复杂的结构通过tcp/ip发送

本文关键字:结构 tcp 发送 ip 复杂 序列化 一个 | 更新日期: 2023-09-27 18:03:22

我有以下结构

[Serializable()]
public struct Transfer_packet 
  {
     public int  _packet_type; // 0 is action 1 is data
     public int _packet_len; // length of data
     public byte[] _data;//Content of data it's Length depends on objects types 
        public byte[] serialize()
        {
            byte[] arr;
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, this);
            arr = ms.ToArray();
           return arr;
        }
    }

在我的代码中我这样做了

            Transfer_packet sndpkt;  
            string cmd = "Some Commands in text or binary bytes";
            byte[] data = ASCIIEncoding.ASCII.GetBytes(cmd);
            sndpkt._packet_type = 0; // Action Packet 
            sndpkt._packet_len = data.Length;  // Length of command
            sndpkt._data = data;
            byte[] SendData = sndpkt.serialize();
            LanAdapter.Send(SendData, System.Net.Sockets.SocketFlags.None); // LanAdapter ->TcpSocket

结构内部的serialize函数不能正常工作,我想要一个序列byte数组的结构,通过网络发送它,并在其他应用程序中以相同的内存格式接收它。

如何序列化一个复杂的结构通过tcp/ip发送

可以实现ISerializable接口
MSDN示例可以提供

您想要检验protobuf-net以获得高性能,平台无关性,对象序列化。在我看来,这绝对是最好的。

用必要的属性修改你的对象:

[ProtoBuf.ProtoContract]
public struct Transfer_packet
{
    [ProtoBuf.ProtoMember(1)]
    public int _packet_type; // 0 is action 1 is data
    [ProtoBuf.ProtoMember(2)]
    public int _packet_len; // length of data
    [ProtoBuf.ProtoMember(3)]
    public byte[] _data;//Content of data it's Length depends on objects types 
    /// <summary>
    /// Private constructor required by protobuf
    /// </summary>
    private Transfer_packet() { }
}

用法是一块蛋糕:

// write to a file
Serializer.Serialize(outputStream, Transfer_packet);
// read from a file
var person = Serializer.Deserialize<Transfer_packet>(inputStream);

我将结构体Transfer_packet内部的序列化函数更改为此,它对我来说很好,但我想要一个智能解决方案而不是这个,编组和序列化添加了一些头或将实际字节数组更改为我不知道的一些东西。

 public struct Transfer_packet 
        {
            public short  _packet_type; // 0 is action 1 is data
            public int _packet_len; // length of data
            public byte[] _data;//Content of data it's Length depends on objects types 
            public byte[] serialize()
            {
                byte[] arr;
                MemoryStream ms = new MemoryStream();
                arr = BitConverter.GetBytes(this._packet_type);
               // Array.Reverse(arr);
                ms.Write(arr, 0, arr.Length);
                arr = BitConverter.GetBytes(this._packet_len);
               // Array.Reverse(arr);
                ms.Write(arr,0,arr.Length);
                ms.Write(this._data, 0, this._data.Length);
                arr = ms.ToArray();
               return arr;
            }
        }