BinaryFormatter, точный буфер TYPE-SIZE - PullRequest
3 голосов
/ 10 мая 2011

У меня есть этот сериализуемый класс:

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

и мне нужно, чтобы класс был классом, а не структурой.Есть ли способ?

1 Ответ

0 голосов
/ 10 мая 2011

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

Кроме того, если в вашем классе есть ссылки на другие классы, это не сработает.

Как правило, передача данных по сети, как правило, не является решением, и вам следует использовать что-то вроде BinaryFormatter, XML или JSON.

...