byte[] arr = new byte[sizeof(PlayerCalculationData)];
, сообщая, что
Сannot take the address of, get the size of, or declare a pointer to a managed type ('TermalDrawPlayer.PlayerCalculationData')
Вопрос: как правильно работать со структурами в unmanaged-коде, чтобы не возникало таких ошибок? Надо узнать размер структуры после выделения памяти под массив и его заполнения.
Спасибо заранее.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, SilverEye, Вы писали:
Mab>Marshal.SizeOf
Когда пишу
byte[] arr = new byte[Marshal.SizeOf(PlayerCalculationData)];
выскакивает ошибка 'TermalDrawPlayer.PlayerCalculationData' is a 'type' but is used like a 'variable'
Хотя, как я понимаю, SizeOf есть как с аргументом типа object, так и с типом Type. Почему не работает в таком случае с object?
Правильным будет записать так?
byte[] arr = new byte[Marshal.SizeOf(typeof(PlayerCalculationData))];
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, SilverEye, Вы писали:
WH>А зачем тебе вобще unsafe понадобился?
Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив.
Нашёл на одном форуме англоязычном вот такое решение проблемы: http://www.dotnet247.com/247reference/msgs/18/91438.aspx
Только в том случае структура содержала только переменные, но не содержала массивов. А массив воспринимается компилятором как managed-тип, поэтому оказывается невозможно создать на него указатель и привести его к указателю на массив байтов. (Как определить размер я уже разобрался.)
Ошибка появляется в следующем коде:
Здравствуйте, SilverEye, Вы писали:
SE>Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив.
Блин сколько раз говорили людям говорить чето вам действительно надо...
Ненужен тут никакой unsafe.
Смотри BinaryWriter, а еще лучше не изобретай велосипедов используй сериализацию. См BinaryFormatter.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, SilverEye, Вы писали:
SE>>Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив. WH>Блин сколько раз говорили людям говорить чето вам действительно надо... WH>Ненужен тут никакой unsafe. WH>Смотри BinaryWriter, а еще лучше не изобретай велосипедов используй сериализацию. См BinaryFormatter.
Спасибо.
Тогда у меня несколько вопросов по сериализации. Объясню, что я хочу получить.
Мне нужен архив, внутри которого будет находиться много файлов, каждый из которых — результат расчётов в некоторый момент времени. Также отдельным файлом в этом архиве лежит файл настроек.
Я сначала хотел перегруженным методом Write(...) класса ZipOutputStream, наследника от Stream, писать в файл архива результаты расчёта, по одному, по мере поступления результатов из программы. Результатов много и каждый из них считается достаточно долго, поэтому последовательная запись в файл оправдана (расчёт теоретически может проводиться и несколько дней).
Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока?
Здравствуйте, SilverEye, Вы писали:
SE>Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока?
Он пишет данные используя метод Write того потока который в него передали.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, SilverEye, Вы писали:
SE>>Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока? WH>Он пишет данные используя метод Write того потока который в него передали.
Спасибо за помощь! Сейчас попробую реализовать.