Общий BitConverter.GetBytes возможно в .NET? - PullRequest
2 голосов
/ 03 марта 2010

Можно ли создать метод, подобный BitConverter.GetBytes () , который принимает в качестве входных данных также параметр типа Объект , без использования маршалинга, как это сделано здесь

Или единственное решение, если в качестве входных данных задан тип Object, это реализовать case на всех доступных типах значений .NET ?

Ответы [ 2 ]

5 голосов
/ 03 марта 2010

Нет, это не так. Внутренний макет класса или структуры не обнаруживаем. Маршалинг необходим, руководствуясь [StructLayout], чтобы преобразовать этот недокументированный макет в известный. JIT-компилятор с готовностью использует это, он переупорядочивает поля в структуре, например, чтобы выровнять их должным образом и потребовать минимум памяти. Это побеждает любые уловки, которые путаются с неуправляемыми указателями. Простые типы значений ведут себя предсказуемо, но они уже хорошо защищены BitConverter. Структуры - ваш заклятый враг.

Это одна из причин того, что файлы с отображением в памяти так долго поддерживаются .NET Framework. Но они будут доступны в .NET 4.0, вы можете воспользоваться классом MemoryMappedViewAccessor. Он все еще использует маршалинг, он спрятан под ковриком.

0 голосов
/ 23 сентября 2017

Bitconverter.GetBytes ((динамическая) v);

...