2013-03-10 2 views
2

Я следующая структуреКак сериализовать сложную структуру для отправки через tcp/ip?

[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++.

ответ

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

Вы можете реализовать ISerializable интерфейс
MSDN sample может служить

+0

я есть попробовать сортировочной как хорошо, но она не обеспечивает мне правильную карту памяти для отправки над сетью и обработать ее в приложении C++. Спасибо за ваш ответ. Я проверю, что ищу конкретный метод;) – saeed

+1

http://stackoverflow.com/questions/5209297/about-c-sharp-struct-memory-serialization-overhead и http://stackoverflow.com/questions/628843/byte-for-byte-serializa могут быть полезными, а http://stackoverflow.com/questions/9944994/fast-serialization-deserialization-of-structs могут быть полезными. –

+0

, прежде чем я задаю этот вопрос, я разобрал его и нашел некоторые методы, но ни один из них не конвертирует мою структуру, так как я хочу изменить серийный код на этот – saeed

1

Вы хотите оформить protobuf-net для обеспечения высокой производительности, платформы агностиком, сериализации объектов. Это ИМХО подает лучшее.

Modifiy ваш объект с необходимыми атрибутами:

[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); 
+0

Я ищу мудрый и стандартный метод отправки и получения данных на родном C++, которая предназначена для платформы Windows. Кстати спасибо за ваше внимание. – saeed