3

私はこのシリアライズ可能なクラスを持っています:

[Serializable]
public class myClass
{

     public byte myByte { get; set; }
     public short myShort { get; set; }
     public int myInt { get; set; }
}

タイプ BYTE は 1 バイト、タイプ SHORT は 2 バイト、タイプ INT は 4 バイトであることを知っているため、7 バイトのバッファを待っていましたが、次のコードでは 232 バイトのバッファ サイズを取得しました。

myClass mc = new myClass { myByte = 0xff, myShort = 0x009c, myInt = 0x00000045 };
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, mc);
byte[] buffer = ms.ToArray();

次のようなコードで手間をかけずに、「正確なタイプサイズのバッファ」をIP経由で送信したいと思います。

byte[] exactBuffer = new byte[sizeof(byte) + sizeof(short) + sizeof(int)];
exactBuffer[0] = mc.myByte;
byte[] bmyShort = BitConverter.GetBytes(mc.myShort);
System.Buffer.BlockCopy(bmyShort, 0, exactBuffer, sizeof(byte), bmyShort.Length);
byte[] bmyInt = BitConverter.GetBytes(mc.myInt);
System.Buffer.BlockCopy(bmyInt, 0, exactBuffer, sizeof(byte)+sizeof(short), bmyInt.Length);

クラスを構造体ではなくクラスにする必要があります。方法はありますか?

4

1 に答える 1

0

この投稿で提案されているような相互運用機能とコードを使用できます。ただし、指定しない場合、言語は任意のメモリ レイアウトを使用できることに注意してください。そのため、StructLayout属性を使用する必要があります。

また、クラスに他のクラスへの参照が含まれている場合、これは機能しません。

一般に、ネットワークを介してこのようなデータを転送することは解決策にならない傾向がありBinaryFormatter、.xml や JSON などを使用する必要があります。

于 2011-05-09T22:01:00.270 に答える