Uygulamamla dağıtmak için salt okunur verileri nasıl saklamalıyım?


17

Bir masaüstü uygulaması geliştiriyorum ve bu uygulamanın çalışması için, bazı bilgiler gerektirir, ancak (veriler bu bilgilerden herhangi değişmez gerekir uygulamanın her yürütme yüklenecek, ancak veri olduğunu asla değişti). Veriler, uygulamanın çalıştığı bilgisayarda (istemci tarafında depolama?) Depolanmalıdır.

Kullanıcının bu bilgileri kolayca değiştirememesi de daha iyidir (çok fazla BT bilgisine sahip olmadığını varsayalım).

Bu tür bilgileri nasıl saklamalıyım? Yerel bir veritabanı mı? Uygulama ile gönderilen XML?

WPF kullanıyorum.


2
Bu bir meta değil. Meta, soruların sorulduğu ana sitelerle ilgili sorunları veya endişeleri tartışan bir sitedir.
jpmc26

1
Neden kullanıcıların bilgileri değiştirmesini istemiyorsunuz? Bu bir güvenlik sorunu mu yoksa ne? Bu bilgilerin kullanıcıdan gizli tutulması gerekiyor mu? Sebepler, hangi cevapların uygun olduğunu büyük ölçüde değiştirebilir.
jpmc26

1
@ jpmc26 Bu bir tür güvenlik sorunu, ama çok da önemli değil. Uygulamanın ana amacı, (örneğin bir sıcaklık kontrol cihazı ile birlikte seri bağlantı noktası üzerinden iletişim kurmak için , bu bir), ve XML kontrol ünitesinin bellek adresleri ile ilgili bazı bilgileri depolar. Kullanıcı bunu değiştirirse, yürütme sırasında sorunlara neden olabilir, bu yüzden önlemek istiyorum. Ama bu sadece dediğim gibi bir endişe değil. ps: yerine soru düzenlenmiş meta için SE . Teşekkürler.
appa yip yip

2
Yerel bir veritabanı istiyorsanız, SQLite'a bakınız. (Ancak veriler başlangıçta RAM'e yüklenecek kadar küçükse, json veya ikili bir şey gibi basit bir yapılandırılmış dosyayı tercih ederim)
CodesInChaos

1
"Kullanıcı değiştirirse, yürütme sırasında sorunlara neden olabilir, bu yüzden bundan kaçınmak istiyorum." bir güvenlik kaygısı gibi gelmiyor. Güvenlik kaygısı, dosyada parola veya benzeri bir parola bulunduğunuzda ortaya çıkar. Ayarları çalıştırılabilir öğenin yanındaki bir XML dosyasına yerleştirin ve en üste "Bu dosyadaki ayarlara dokunmayın !!" yazan bir yorum koyun. Kullanıcının yükleme dizininizdeki rasgele dosyaları düzenlemesi durumunda, aldıkları her türlü kırılmayı hak eder.
Roger Lipscombe

Yanıtlar:


14

İkili bir dosya bariz cevap olacaktır, ancak nasıl yüklediğinize bağlıdır - eğer yapabiliyorsanız hayatı kendiniz de kolaylaştırabilirsiniz.

Bunu okumak için C # 'de yerleşik yöntemler olduğundan XML iyi bir seçim olabilir. Verilerinize bir sağlama toplamı ekleyebilirsiniz , böylece kullanıcı değiştirirse sağlama toplamı artık eşleşmez (sağlama toplamının geçerli olduğundan emin olmak için bir kontrol eklemeniz gerekir)

Yerel bir db daha fazla sorun yaratabilir, çünkü başka bağımlılıklara erişebilirsiniz.


Sağlama toplamını düşünmedim, bu gerçekten güzel bir fikir. Bu yüzden bir sağlama toplamı oluşturuyorum ve uygulamamda saklıyorum, bu yüzden XML'nin serisini kaldırdığımda yeni bir sağlama toplamı oluşturup birincisi ile karşılaştırırım?
appa yip yip

4
Sağlama toplamını uygulamada saklarsanız, asla farklı bir yapılandırmaya izin vermezsiniz, bu nedenle yapılandırma verilerini kodunuzda uygulama sabitleri olarak da saklayabilirsiniz. İleride yapılandırmayı değiştirmek istiyorsanız, sağlama toplamını (daha iyi bir terim "karma" olacaktır) XML alanı olarak ekleyin ve XML'nin tahrif edilmediğini doğrulamak için kullanın. Elbette, kararlı bir saldırgan kodunuzu araştırabilir, karma mantığınızı bulabilir ve geçerli XML dosyaları üretmek için kullanabilir, ancak yine de istemci tarafı uygulamaları belirlenen saldırganlara karşı her zaman savunmasızdır.
SJuan76

4
Dosya veya yerel db yerine, derlemeye gömülü kaynak dosya daha iyi olurdu. Son kullanıcıdan gizlidir, geliştirici tarafından kolayca yönetilebilir, ancak yine de güç kullanıcı dostudur. Performans bir endişe kaynağıysa, ikili serileştirme daha iyi olur.
PTwr

@ SJuan76 Evet, XML'deki karma sorunu, birisi seriyi kaldırırsa değiştirilebiliyor olmasıdır. Neyse, eğer sadece, uygulamanın yeni sürümü üzerinde değişecek (Ben bir şey olmayacak düşünüyorum, ama kim bilir) XML değişikliği, bu yüzden sanırım kod üzerinde karma çakacağım.
appa yip yip

2
@schmaedeck: Kaynak dosyalar, tam anlamıyla yürütülebilir ikili dosyadaki dosyalardır. Simgeler ve dizeler ve programınızın ihtiyacı olan diğer sabit veriler.
Mooing Duck

21

Veriler hiçbir zaman değişmezse ve salt okunursa , sabitler listesi olarak bir kod dosyasına koyun.

public readonly string AppStartUpData = "MyAppNeedsThis";

Bu veriler dağıtım başına farklıysa, harici bir dosya uygundur.

.Net yerleşik .config dosyaları (App.Config) ile birlikte gelir. Bunları, onlardan gelen bilgileri okumak için standart yollar (çerçeve içine yerleştirilmiş) olduğu için kullanmalıdır.

Bir ayarın yalnızca metin dosyaları (Xml) olduğu için değişmesi (asla asla deme) durumunda yapılandırma dosyalarını kullanın. Hassas bilgiler varsa, gerekirse bir ayar şifrelenebilir.


Sabitler / readonly'ler hakkında düşündüm, sorun çok fazla veri olması, bu yüzden dış dosyayı takip edeceğim sanırım. Teşekkür ederim!
appa yip yip

5
@schmaedeck ... yani? Bu tanımları ayrı bir dosyaya koyabilir ve içe aktarabilirsiniz. Aslında, Qt'ın bu tür şeyleri formları ve şeyleri derlerken yaptığına inanıyorum, böylece bazı sabitlerde megabayt ikili veri (örneğin görüntüler) olan otomatik olarak oluşturulan dosyalar elde edersiniz, ancak ayrı bir dosyadaysa bununla ilgili yanlış bir şey yoktur. .
Bakuriu

15

Projenize her zaman bir dosya ekleyebilir ve derleme türünü Embedded Resourcedoğrudan uygulamanın kendisine gömülecek şekilde ayarlayabilirsiniz .

Alternatif olarak, şifrelenmiş ve erişilebilir bir konuma yerleştirilmiş bir dosya.


1
Bu en iyi cevap. Nasıl başarabileceğime dair daha fazla rehberlik görmek istiyorum. Potansiyel olarak değiştirilebilen bir yapılandırma dosyasının avantajlarından yararlanırsınız, ancak derlemenize gömülü olduğu için dosyayı sabit tutarsınız.
Gusdor

5

Kullanıcının verilere bakmasını bile istemiyorsanız, onu ikili bir veri dosyasına serileştirmelisiniz.

Sadece uygulama ondan okumak için parçaların uzunluğunu bilecekti.

C # bilmiyorum ama Java dosya böyle oluşturmak istiyorum:

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

... ve bunu şöyle okurlar:

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();

İkili serileştirmeyi kesinlikle kullanacağım. Zaman ayırdığınız için çok teşekkürler!
appa yip yip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.