2017-04-25 10 views
0

このコードで私の目的は、この構造体がデータを読み出すのを待つサーバに構造体を送ることです。だから私はそれを読むことができ、理解することができる構造体をサーバーに与えるためにすべての参照をシリアル化する必要があります。UWP - TCPを使って送るために構造体をシリアライズ

私はlong、ulong、string、enum、long []などの構造体を含む構造体を持っています。私はすでにstackoverflowを検索しましたが、すべてのソリューションは、文字列を除いてゼロに自分の構造体をシリアル化します。

構造体を正しくシリアル化し、バイト[]に保存して、最後にtcpで送信しますか?

マイヘッダ構造体(that's why my struct looks like thisは):構造体をシリアル化する

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = 4, Size = size)] 
      public struct _HEADER 
      { 
       [FieldOffset(0)] 
       public Constants._TYPE Type; 
       [FieldOffset(4)] 
       public long Cr; 
       [FieldOffset(12)] 
       public Id Id; 
       [FieldOffset(SIZE+12), MarshalAs(UnmanagedType.ByValArray)] 
       public long[] array; 
      } 

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = 4, Size = SIZE)] 
      public struct Id 
      { 
       [FieldOffset(0)] 
       public long Protocol; 
       [FieldOffset(8)] 
       public long Protocol; 
       [FieldOffset(16)] 
       public Constants._TYPE CType; 
       [FieldOffset(20)] 
       public Constants._TYPE Cred; 
       [FieldOffset(24)] 
       public Constants._TYPE CGred; 
      } 

私の現在の方法:データを送信する

IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(header)); 
    Marshal.StructureToPtr(header, pointer, false); 
    byte[] headerdata = new byte[Marshal.SizeOf(header)]; 
    Marshal.Copy(pointer, headerdata, 0, headerdata.Length); 
    Marshal.FreeHGlobal(pointer); 

私の現在の方法:

_socket.Send(headerdata); 

This is what I get in the tcp-packet, which I send to the server:

+0

ネットワークプロトコルとして構造体を使用しないでください。ネットワークプロトコルとしてネットワークプロトコルを使用する。 – EJP

+0

私はサーバーを実装していません。サーバーはstrcutが必要なので、構造体を送信する必要があります。 – David

答えて

0

なぜBinaryFormatterを使用しないのですか? https://msdn.microsoft.com/en-us/library/c5sbs8z9(v=vs.110).aspx

+0

BinaryFormatterは自分の構造体をストリームにシリアル化します。私はそれをtcpで送るためにバイト[]でそれを必要とします。 – David

+0

これをMemoryStreamにシリアル化し、基礎となるバイト配列を取得します – user987949

+1

BinaryFormatterはUWPに存在しません! – David

関連する問題