#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. Почему это произошло?