【问题标题】:How to serialize a complex structure to send via tcp/ip?如何序列化复杂结构以通过 tcp/ip 发送?
【发布时间】:2013-03-10 22:01:56
【问题描述】:

我有以下结构

[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

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

【问题讨论】:

    标签: c# sockets serialization memorystream


    【解决方案1】:

    你可以实现ISerializable接口
    MSDN sample 可以服务

    【讨论】:

    【解决方案2】:

    您想签出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);
    

    【讨论】:

    • 我正在寻找一种明智和标准的方法来在面向 Windows 平台的本机 C++ 网络程序中发送和接收数据。顺便感谢您的关注。
    【解决方案3】:

    我将 struct Transfer_packet 中的序列化函数更改为此,它对我来说很好,但我想要一个智能解决方案而不是这个,编组和 Iserialize 添加一些标题或将实际字节数组更改为我不知道的东西'不知道。

     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;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2016-07-31
      • 2018-02-28
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2016-02-17
      相关资源
      最近更新 更多