Bagaimana saya harus menyimpan data hanya baca untuk digunakan dengan aplikasi saya?

17

Saya sedang mengembangkan aplikasi desktop, dan aplikasi ini membutuhkan beberapa informasi untuk dijalankan, tetapi itu tidak mengubah informasi ini (data harus dimuat pada setiap eksekusi aplikasi, tetapi datanya tidak pernah berubah). Data harus disimpan di komputer yang sama dengan saat aplikasi berjalan (penyimpanan sisi klien?).

Juga lebih baik jika pengguna tidak dapat dengan mudah mengubah informasi ini (anggap bahwa mereka tidak memiliki banyak pengetahuan IT).

Bagaimana saya harus menyimpan informasi semacam ini? Database lokal? XML yang dikirim bersama aplikasi?

Saya menggunakan WPF.

appa yip yip
sumber
2
Ini bukan meta. Meta adalah situs untuk membahas masalah atau masalah tentang situs utama tempat pertanyaan diajukan.
jpmc26
1
Mengapa Anda tidak ingin pengguna mengubah informasi? Apakah itu masalah keamanan atau apa? Apakah informasi ini seharusnya dirahasiakan dari pengguna? Alasannya bisa sangat mengubah jawaban apa yang sesuai.
jpmc26
1
@ jpmc26 Yah, ini semacam masalah keamanan, tapi itu bukan masalah besar. Tujuan utama aplikasi adalah untuk berkomunikasi melalui port serial dengan pengontrol suhu (seperti ini ), dan XML akan menyimpan beberapa informasi tentang alamat memori pengontrol. Jika pengguna mengubahnya, itu dapat menyebabkan masalah selama eksekusi, jadi saya ingin menghindarinya. Tapi itu hanya masalah, seperti yang saya katakan, bukan masalah besar. ps: mengedit pertanyaan untuk mengganti meta untuk SE . Terima kasih.
appa yip yip
2
Jika Anda menginginkan database lokal, lihatlah SQLite. (Tetapi jika data cukup kecil untuk dimuat ke dalam RAM saat startup, saya lebih suka file terstruktur sederhana seperti json atau sesuatu biner)
CodesInChaos
1
"Jika pengguna mengubahnya, itu dapat menyebabkan masalah selama eksekusi, jadi saya ingin menghindarinya." sama sekali tidak terdengar seperti masalah keamanan. Masalah keamanan adalah masalah di mana Anda memiliki frasa sandi atau yang serupa dalam file. Cukup masukkan pengaturan dalam file XML di sebelah yang dapat dieksekusi, dan beri komentar di bagian atas yang bertuliskan "Jangan sentuh pengaturan dalam file ini !!". Jika pengguna mengedit file acak di direktori instal Anda, maka mereka layak mendapatkan kerusakan apa pun yang mereka dapatkan.
Roger Lipscombe

Jawaban:

14

File biner akan menjadi jawaban yang jelas, tetapi itu tergantung pada bagaimana Anda memuatnya - Anda mungkin bisa membuat hidup Anda lebih mudah jika Anda bisa.

XML mungkin merupakan pilihan yang baik karena ada metode bawaan di C # untuk membaca ini. Anda bisa menambahkan checksum ke data Anda, sehingga jika pengguna mengubahnya, checksum tidak akan cocok lagi (Anda perlu menambahkan cek untuk memastikan checksum itu valid)

Sebuah db lokal mungkin menciptakan lebih banyak masalah karena Anda memiliki dependensi lain yang Anda perlukan untuk dapat mengaksesnya

Matt Wilko
sumber
Saya belum memikirkan tentang checksum, itu ide yang sangat bagus. Jadi saya menghasilkan checksum dan menyimpannya di aplikasi saya, jadi setiap kali saya membatalkan XML, saya membuat checksum baru dan membandingkannya dengan yang pertama?
appa yip yip
4
Jika Anda menyimpan checksum dalam aplikasi, Anda tidak akan pernah mengizinkan konfigurasi yang berbeda, jadi Anda juga dapat menyimpan data konfigurasi sebagai konstanta aplikasi dalam kode Anda. Jika Anda ingin dapat mengubah konfigurasi di masa mendatang, tambahkan checksum (istilah yang lebih baik akan menjadi "hash") sebagai bidang XML, dan menggunakannya untuk memverifikasi bahwa XML belum dirusak. Tentu saja, penyerang yang gigih dapat meneliti kode Anda, menemukan logika hash Anda dan menggunakannya untuk menghasilkan file XML yang valid, tetapi bagaimanapun aplikasi sisi klien selalu rentan terhadap penyerang yang ditentukan.
SJuan76
4
Alih-alih file atau db lokal, file sumber daya yang tertanam dalam perakitan akan lebih baik. Tersembunyi dari pengguna akhir, mudah dikelola oleh pengembang namun tetap ramah pengguna. Jika kinerja menjadi perhatian, maka serialisasi biner akan lebih unggul.
PTwr
@ SJuan76 Ya, masalah hash pada XML adalah itu bisa diubah jika seseorang membatalkan pengunaannya. Bagaimanapun, jika perubahan XML (yang saya pikir tidak akan terjadi, tetapi siapa tahu) itu hanya akan berubah pada versi baru dari aplikasi, jadi saya kira saya akan tetap dengan hash pada kode.
appa yip yip
2
@schmaedeck: File sumber daya adalah file di dalam biner yang dapat dieksekusi. Ikon dan string dan data konstan apa pun yang dibutuhkan oleh program Anda.
Mooing Duck
21

Jika data tidak pernah berubah dan hanya dibaca , maka masukkan saja ke dalam file kode sebagai daftar konstanta.

public readonly string AppStartUpData = "MyAppNeedsThis";

Jika data ini berbeda per penyebaran, maka file eksternal baik-baik saja.

.Net hadir dengan file .config bawaan (App.Config). Orang harus menggunakan itu karena ada cara standar (dibangun ke kerangka kerja) untuk membaca informasi dari mereka.

Gunakan file konfigurasi jika pengaturan perlu diubah (tidak pernah mengatakan tidak) karena hanya file teks (Xml). Jika ada informasi sensitif, seseorang dapat mengenkripsi pengaturan jika diperlukan.

Jon Raynor
sumber
Saya berpikir tentang konstanta / readonlys, masalahnya adalah ada banyak data, jadi saya kira saya akan menindaklanjuti dengan file eksternal. Terima kasih!
appa yip yip
5
@schmaedeck ... jadi? Anda dapat meletakkan definisi tersebut dalam file terpisah dan mengimpornya. Sebenarnya saya percaya Qt melakukan hal-hal seperti ini ketika mengkompilasi formulir dan hal-hal sehingga Anda berakhir dengan file yang dihasilkan secara otomatis yang memiliki megabyte data biner (misalnya gambar) di beberapa konstanta, tetapi jika berada di file terpisah, tidak ada yang salah dengan itu .
Bakuriu
15

Anda selalu dapat menambahkan file ke dalam proyek Anda dan mengatur tipe build-nya Embedded Resourcesehingga tertanam langsung ke dalam aplikasi itu sendiri.

Atau file yang dienkripsi dan ditempatkan di lokasi yang dapat diakses.

TheLethalCoder
sumber
1
Ini jawaban terbaik. Saya ingin melihat lebih banyak panduan untuk bagaimana mencapainya. Anda mendapatkan manfaat dari file konfigurasi yang berpotensi diubah tetapi harus tetap statis karena tertanam dalam perakitan Anda.
Gusdor
5

Jika Anda tidak ingin pengguna bahkan mengintip data, Anda harus membuat cerita bersambung menjadi file data biner.

Hanya aplikasi yang akan mengetahui panjang bilah untuk dibaca.

Saya tidak tahu C # tetapi di Jawa Anda akan membuat file seperti ini:

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

... dan mereka membacanya seperti ini:

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();
Tulains Córdova
sumber
Saya pasti akan menggunakan serialisasi biner. Terima kasih banyak atas waktu Anda!
appa yip yip