Можно ли преобразовать любой произвольный файл в строку? (C#)

#c# #json

#c# #json

Вопрос:

Мне нужно сохранить произвольное количество файлов (с любым типом файла) в качестве свойства класса. Этот класс будет сериализован в файл JSON. Позже пользователь может загрузить файл JSON обратно в приложение и имеет возможность воссоздать файлы, которые они первоначально загрузили. Прямо сейчас я сохраняю файлы в виде массива байтов. Проблема в том, что некоторые файлы большие, а массив байтов слишком велик и приводит к тому, что сериализация / десериализация занимает очень много времени.

Есть ли способ сохранить файлы в виде строки / массива строк вместо байтов? Или какой-то другой способ хранения файлов? Какие есть варианты решения этой проблемы?

редактировать: я считаю, что строка будет быстрее, потому что прямо сейчас, когда массив байтов отображается в формате JSON в формате ascii, это выглядит так: 150,123,43,62…

Комментарии:

1. Почему вы считаете, что строка будет меньше массива байтов? Или, скорее, что будет иметь эта строка?

2. Строка должна быть как минимум в два раза больше массива байтов, в зависимости от используемой кодировки.

3. Загрузка больших файлов займет много времени, и вы мало что можете сделать в программном обеспечении, чтобы исправить это

Ответ №1:

Закодируйте свой байтовый массив как базовую строку 64 , используя Convert.ToBase64String() . Это должно значительно уменьшить размер вашего JSON: http://rextester.com/ILJNV57711

Например, вот массив случайных байтов, сериализованный как JSON:

 [95,103,154,174,23,5,178,179,158,186,181,89,40,229,233,168,217,42,98,65,248]
 

Вот тот же массив, преобразованный в базовую строку 64, сериализованную как JSON:

 "X2earhcFsrOeurVZKOXpqNkqYkH4"
 

Ясно видно, что массив байтов в JSON меньше, если он выражен в виде строки base 64. Он варьируется от 76 символов до 30.

Комментарии:

1. Я попробовал это: var horribleWay = File . ReadAllBytes(путь к файлу); var goodWay = Преобразовать. ToBase64String(horribleWay); Я проверил это на небольшом файле, и когда я посмотрел на количество для каждого, я нашел horribleWay = 10152 и goodWay = 13536. Что происходит?

2. @user3715648 ваш файл имеет размер 10 КБ, но данные, которые вы записываете в json, представляют собой массив из 10 000 чисел. base64 должен быть записан в виде строки.

3. Ах, да. Глупый я. И последнее: как мне записать эту строку обратно в файл? Нужно ли мне преобразовать его обратно в массив байтов?

4. Используется Convert.FromBase64String() для получения массива байтов.

Ответ №2:

Конечно, не храните массив байтов в виде десятичных чисел подобным образом; Base64, по крайней мере, кодирует его. Кодировка Base64 увеличит размер данных до 133% от размера необработанного файла, но это будет значительным улучшением по сравнению с 400%-ным увеличением, которое вы используете в настоящее время.

Комментарии:

1. Итак, что-то вроде этого?: var horribleWay = File . ReadAllBytes(путь к файлу); var goodWay = Преобразовать. ToBase64String(ужасный путь);

2. Когда я попробовал это, размер horribleWay был меньше, чем goodWay. Почему это произошло?