Как перевести файл в байты c

Обновлено: 07.07.2024

Я пишу прототип TCP-соединения, и у меня возникают проблемы с усреднением данных для отправки.

На данный момент я посылаю только строки, но в будущем мы хотим иметь возможность отправлять любые объекты.

На данный момент код довольно прост, потому что я думал, что все можно записать в байтовый массив:

Это, конечно, достаточно легко решить с помощью

Проблема в том, что если я делаю это таким образом, мне нужно проверять КАЖДЫЙ тип объекта, который не может быть приведен к байту [] во время выполнения.

Поскольку я не знаю каждый объект, который нельзя преобразовать в byte [] во время выполнения, это действительно не вариант.

В общем случае это невозможно каким-либо значимым способом (например, рассмотрим экземпляр FileStream или любой объект, который инкапсулирует дескриптор подобного типа).

Обратите внимание, что obj и любые свойства / поля внутри obj (и так далее для всех их свойств / полей) должны быть помечены Serializable атрибутом для успешной сериализации с этим.

Будьте осторожны с тем, что вы делаете с «любым» объектом на другой стороне, поскольку это может больше не иметь смысла (например, если этот объект был дескриптором файла или подобным) Да, нормальные предостережения применяются, но это не плохая идея, чтобы напомнить людям о них. Это может быть хорошей идеей, чтобы обернуть использование MemoryStream в using блоке, так как он освободит внутренний используемый буфер.

Используйте код ниже

Как уже упоминалось в комментарии к этому ответу , они MemorySteam должны быть заключены в using блок. Извини, я не могу понять твою проблему. Вы можете опубликовать код? @kombsh Я пытаюсь в краткой форме: [Serializable] class GameConfiguration byte [] baPacket; GameConfiguration objGameConfClient = new GameConfiguration (); baPacket = BinModler.ObjectToByteArray (objGameConfClient); Теперь baPacket содержит около 244 байт для содержимого. Я ожидал этого нужно просто 12. @kombsh вы можете явно утилизировать одноразовые предметы в вашем примере.

Как уже говорили другие, вы можете использовать двоичную сериализацию, но она может создать дополнительные байты или быть десериализована в объекты с не совсем такими же данными. Использование отражения с другой стороны довольно сложно и очень медленно. Есть еще одно решение, которое может строго преобразовывать ваши объекты в байты и наоборот - сортировка:

И преобразовать байты в объект:

Заметно медленнее и отчасти небезопасно использовать этот подход для небольших объектов и структур по сравнению с вашим собственным полем сериализации по полю (из-за двойного копирования из / в неуправляемую память), но это самый простой способ строго преобразовать объект в byte [] без реализации сериализации и без атрибута [Сериализуемый].

Читайте также: