2

私は次の構造体を持っています

[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ネット経由で送信し、C++で記述された他のアプリケーションで同じメモリ形式で受信するための構造体のシーケンス配列が必要です。

4

3 に答える 3

1

高パフォーマンス、プラットフォームに依存しない、オブジェクトのシリアル化のために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);
于 2013-03-10T14:01:56.370 に答える
1

MSDNサンプルが提供するISerializableインターフェイスを実装できます

于 2013-03-10T07:18:10.380 に答える
0

構造体内のシリアル化関数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;
            }
        }
于 2013-03-10T08:22:57.867 に答える