Как хранить данные только для чтения для развертывания с моим приложением?

17

Я разрабатываю настольное приложение, и этому приложению для запуска требуется некоторая информация, но она не меняет эту информацию (данные должны загружаться при каждом запуске приложения, но данные никогда не изменяются). Данные должны храниться на том же компьютере, на котором запущено приложение (хранилище на стороне клиента?).

Также лучше, если пользователь не может легко изменить эту информацию (предположим, что он не обладает большими знаниями в области ИТ).

Как мне хранить такую ​​информацию? Локальная база данных? XML, который отправляется с приложением?

Я использую WPF.

аппа ип ип
источник
2
Это не мета. Мета - это сайт, на котором обсуждаются проблемы или опасения по поводу основных сайтов, где задаются вопросы.
jpmc26
1
Почему вы не хотите, чтобы пользователи меняли информацию? Это проблема безопасности или что? Предполагается, что эта информация хранится в тайне от пользователя? Причины могут сильно изменить то, какие ответы уместны.
jpmc26
1
@ jpmc26 Ну, это своего рода проблема безопасности, но это не имеет большого значения . Основной целью приложения является связь через последовательный порт с контроллером температуры (как этот ), и XML будет хранить некоторую информацию об адресах памяти контроллера. Если пользователь изменяет его, это может вызвать проблемы во время выполнения, поэтому я хотел бы избежать этого. Но это просто проблема, как я уже сказал, не имеет большого значения. PS: отредактировал вопрос, чтобы заменить мета для SE . Благодарю.
AppA YIP YIP
2
Если вам нужна локальная база данных, взгляните на SQLite. (Но если данные достаточно малы для загрузки в оперативную память при запуске, я предпочитаю простой структурированный файл, такой как json или что-то бинарное)
CodesInChaos
1
«Если пользователь изменяет его, это может вызвать проблемы во время выполнения, поэтому я хотел бы избежать этого». совсем не похоже на проблему безопасности. Проблема безопасности - та, в которой у вас есть парольная фраза или что-то подобное в файле. Просто поместите настройки в XML-файл рядом с исполняемым файлом и поместите вверху комментарий, который говорит: «Не трогайте настройки в этом файле !!». Если пользователь редактирует случайные файлы в вашей директории установки, то они заслуживают любой поломки, которую они получают.
Роджер Липскомб

Ответы:

14

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

XML может быть хорошим выбором, так как в C # есть встроенные методы для чтения этого. Вы можете добавить контрольную сумму к своим данным, чтобы, если пользователь изменяет ее, контрольная сумма больше не совпадала (вам необходимо добавить проверку, чтобы убедиться, что контрольная сумма действительна)

Локальная БД может создать больше проблем, потому что у вас есть другие зависимости, вам нужно иметь возможность получить к ней доступ

Мэтт Вилко
источник
Я не думал о контрольной сумме, это действительно хорошая идея. Поэтому я генерирую контрольную сумму и сохраняю ее в своем приложении, поэтому каждый раз, когда я сериализую XML, я генерирую новую контрольную сумму и сравниваю ее с первой?
appa yip yip
4
Если вы сохраняете контрольную сумму в приложении, вы никогда не разрешите другую конфигурацию, поэтому вы можете также сохранить данные конфигурации в виде констант приложения в своем коде. Если вы хотите иметь возможность изменить конфигурацию в будущем, добавьте контрольную сумму (более подходящим термином будет «хеш») в качестве поля XML и используйте ее для проверки того, что XML не был подделан. Конечно, решительный злоумышленник может исследовать ваш код, найти вашу хэш-логику и использовать ее для создания допустимых файлов XML, но в любом случае клиентские приложения всегда уязвимы для решительных злоумышленников.
SJuan76
4
Вместо файла или локальной базы данных лучше использовать файл ресурсов, встроенный в сборку. Скрытый от конечного пользователя, легко управляемый разработчиком, но все же удобный для пользователя. Если производительность является проблемой, то двоичная сериализация будет лучше.
PTwr
@ SJuan76 Да, проблема хэша в XML заключается в том, что его можно изменить, если кто-то его не сериализует. В любом случае, если изменение XML (которое, я думаю, не произойдет, но кто знает), оно изменится только в новой версии приложения, так что, думаю, я буду придерживаться хэша в коде.
AppA YIP YIP
2
@schmaedeck: Ресурсные файлы - это буквально файлы внутри исполняемого двоичного файла. Иконки и строки и любые другие постоянные данные, необходимые вашей программе.
Mooing Duck
21

Если данные никогда не изменяются и доступны только для чтения , просто поместите их в файл кода в виде списка констант.

public readonly string AppStartUpData = "MyAppNeedsThis";

Если эти данные отличаются для каждого развертывания, тогда внешний файл подойдет.

.Net поставляется со встроенными файлами .config (App.Config). Следует использовать их, так как есть стандартные способы (встроенные в структуру), чтобы прочитать информацию из них.

Используйте файлы конфигурации на случай, если необходимо изменить настройку (никогда не говори никогда), поскольку это просто текстовые файлы (Xml). Если есть конфиденциальная информация, можно при необходимости зашифровать настройку.

Джон Рейнор
источник
Я думал о константах / только для чтения, проблема в том, что там много данных, поэтому я предполагаю, что я свяжусь с внешним файлом. Спасибо!
appa yip yip
5
@schmaedeck ... так? Вы можете поместить эти определения в отдельный файл и импортировать его. На самом деле, я считаю, что Qt делает такие вещи при компиляции форм и прочего, так что вы получите автоматически сгенерированные файлы, в которых есть мегабайты двоичных данных (например, изображений) в некоторых константах, но если это отдельный файл, в этом нет ничего плохого ,
Бакуриу
15

Вы всегда можете добавить файл в свой проект и установить его тип сборки Embedded Resourceтак, чтобы он был встроен непосредственно в само приложение.

Или файл, который зашифрован и размещен в доступном месте.

TheLethalCoder
источник
1
Это лучший ответ. Я хотел бы увидеть еще несколько советов о том, как этого добиться. Вы получаете преимущества потенциально изменяемого файла конфигурации, но сохраняете его статичным, так как он встроен в вашу сборку.
Гусдор
5

Если вы не хотите, чтобы пользователь даже смотрел на данные, вы должны сериализовать их в двоичный файл данных.

Только приложение будет знать длину фрагментов для чтения из него.

Я не знаю C #, но в Java вы могли бы создать файл следующим образом:

FileOutputStream fos = new FileOutputStream(file);      
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(var1);
oos.writeObject(var2);
oos.writeObject(var3);
oos.writeObject(var4);

... и они читают это так:

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o[] = new Object[4];
o[0] = ois.readObject();
o[1] = ois.readObject();
o[2] = ois.readObject();
o[3] = ois.readObject();
Тулаинс Кордова
источник
Я обязательно буду использовать двоичную сериализацию. Большое спасибо за ваше время!
appa yip yip