मुझे अपने आवेदन के साथ तैनाती के लिए आसानी से डेटा कैसे स्टोर करना चाहिए?


17

मैं एक डेस्कटॉप एप्लिकेशन विकसित कर रहा हूं, और इस एप्लिकेशन को चलाने के लिए कुछ जानकारी की आवश्यकता है, लेकिन यह इस जानकारी को नहीं बदलता है (डेटा को एप्लिकेशन के प्रत्येक निष्पादन पर लोड किया जाना चाहिए, लेकिन डेटा कभी नहीं बदला जाता है)। डेटा उसी कंप्यूटर पर संग्रहीत किया जाना चाहिए जैसे ऐप चल रहा है (क्लाइंट-साइड स्टोरेज?)।

यह भी बेहतर है अगर उपयोगकर्ता आसानी से इस जानकारी को नहीं बदल सकता (मान लें कि उनके पास आईटी ज्ञान नहीं है)।

मुझे इस तरह की जानकारी को कैसे स्टोर करना चाहिए? एक स्थानीय डेटाबेस? XML जिसे एप्लिकेशन के साथ भेजा गया है?

मैं WPF का उपयोग कर रहा हूँ।


2
यह कोई मेटा नहीं है। एक मेटा मुख्य साइटों के बारे में समस्याओं या चिंताओं पर चर्चा करने के लिए एक साइट है जहां सवाल पूछे जाते हैं।
jpmc26

1
आप उपयोगकर्ताओं को जानकारी क्यों नहीं बदलना चाहते हैं? यह एक सुरक्षा चिंता है या क्या? क्या यह जानकारी उपयोगकर्ता से गुप्त रखी जानी चाहिए? कारण काफी हद तक बदल सकते हैं जो उत्तर उपयुक्त हैं।
jpmc26

1
@ jpmc26 खैर, यह है की तरह एक सुरक्षा चिंता का विषय है, लेकिन यह एक बड़ी बात नहीं है। आवेदन का मुख्य उद्देश्य एक धारावाहिक बंदरगाह के माध्यम से एक तापमान नियंत्रक (जैसे यह ) के साथ संवाद करना है , और एक्सएमएल नियंत्रक के स्मृति पतों के बारे में कुछ जानकारी संग्रहीत करेगा। यदि उपयोगकर्ता इसे बदल देता है, तो यह निष्पादन के दौरान समस्या पैदा कर सकता है, इसलिए मैं इससे बचना चाहूंगा। लेकिन यह सिर्फ एक चिंता का विषय है, जैसा कि मैंने कहा, बड़ी बात नहीं है। ps: एसई के लिए मेटा को बदलने के लिए प्रश्न को संपादित किया । धन्यवाद।
अप्पा यिप यप

2
यदि आप एक स्थानीय डेटाबेस चाहते हैं, तो SQLite पर एक नज़र डालें। (लेकिन अगर डेटा स्टार्टअप पर रैम में लोड करने के लिए काफी छोटा है, तो मैं एक साधारण संरचित फ़ाइल पसंद करता हूं जैसे कि json या कुछ बाइनरी)
कोडइन्कॉउंस

1
"अगर उपयोगकर्ता इसे बदल देता है, तो यह निष्पादन के दौरान समस्या पैदा कर सकता है, इसलिए मैं इससे बचना चाहूंगा।" सुरक्षा चिंता की तरह बिल्कुल नहीं लगता है। एक सुरक्षा चिंता वह है जहां आपके पास फ़ाइल में पासफ़्रेज़ या समान है। बस निष्पादन योग्य के बगल में एक XML फ़ाइल में सेटिंग्स डालें, और शीर्ष पर एक टिप्पणी डालें जो कहती है कि "इस फ़ाइल में सेटिंग्स को स्पर्श न करें"! यदि उपयोगकर्ता आपके इंस्टॉलेशन डायरेक्टरी में रैंडम फाइल करता है, तो वे जो भी टूटना चाहते हैं, उसके लायक हैं।
रोजर लिप्सकॉम्ब

जवाबों:


14

एक द्विआधारी फ़ाइल स्पष्ट उत्तर होगी, लेकिन यह इस बात पर निर्भर करता है कि आप इसे कैसे लोड कर रहे हैं - यदि आप कर सकते हैं तो आप अपने लिए जीवन को आसान बना सकते हैं।

XML एक अच्छा विकल्प हो सकता है क्योंकि इसे पढ़ने के लिए C # में विधियों का निर्माण किया जाता है। आप अपने डेटा में एक चेकसम जोड़ सकते हैं , ताकि यदि उपयोगकर्ता इसे बदल देता है, तो चेकसम अब मेल नहीं खाएगा (चेकसम मान्य है यह सुनिश्चित करने के लिए आपको चेक जोड़ने की आवश्यकता है)

एक स्थानीय डीबी अधिक समस्याएं पैदा कर सकता है क्योंकि आपके पास अन्य निर्भरताएं हैं जिन्हें आपको एक्सेस करने में सक्षम होना चाहिए


मैंने चेकसम के बारे में नहीं सोचा है, यह एक बहुत अच्छा विचार है। तो मैं एक चेकसम उत्पन्न करता हूं और इसे अपने आवेदन पर संग्रहीत करता हूं, इसलिए हर बार जब मैं एक्सएमएल का खुलासा करता हूं, तो मैं एक नया चेकसम उत्पन्न करता हूं और पहले एक के साथ तुलना करता हूं?
अप्पा यिप यप

4
यदि आप एप्लिकेशन में चेकसम स्टोर करते हैं, तो आप कभी भी एक अलग कॉन्फ़िगरेशन की अनुमति नहीं देंगे, इसलिए आप अपने कोड में एप्लिकेशन कॉन्स्टेंट के रूप में कॉन्फ़िगरेशन डेटा को भी स्टोर कर सकते हैं। यदि आप भविष्य में कॉन्फ़िगरेशन को बदलने में सक्षम होना चाहते हैं, तो XML के क्षेत्र के रूप में चेकसम (एक बेहतर शब्द "हैश" होगा) को जोड़ें और इसका उपयोग करें सत्यापित करने के लिए एक्सएमएल के साथ छेड़छाड़ नहीं की गई है। बेशक, एक निर्धारित हमलावर आपके कोड पर शोध कर सकता है, आपके हैश लॉजिक को खोज सकता है और इसका उपयोग वैध XML फ़ाइलों का उत्पादन करने के लिए कर सकता है, लेकिन वैसे भी क्लाइंट-साइड एप्लिकेशन हमेशा निर्धारित हमलावरों के लिए असुरक्षित होते हैं।
SJuan76

4
फ़ाइल या स्थानीय डीबी के बजाय, असेंबली में एम्बेडेड संसाधन फ़ाइल बेहतर होगी। अंत उपयोगकर्ता से छिपा हुआ, डेवलपर द्वारा आसानी से प्रबंधनीय अभी तक बिजली-उपयोगकर्ता के अनुकूल। यदि प्रदर्शन एक चिंता का विषय है, तो बाइनरी क्रमांकन बेहतर होगा।
पीटी राइटर २०'१६

@ SJuan76 हाँ, एक्सएमएल पर हैश की समस्या यह है कि यदि कोई इसे अनसुना कर देता है तो इसे बदला जा सकता है। वैसे भी, अगर XML बदल जाती है (जो मुझे लगता है कि यह होने वाला नहीं है, लेकिन कौन जानता है) यह केवल ऐप के एक नए संस्करण पर बदल जाएगा, इसलिए मुझे लगता है कि मैं कोड पर हैश के साथ रहूँगा।
अप्पा यिप यप

2
@schmaedeck: संसाधन फाइलें वस्तुतः निष्पादन योग्य बाइनरी के अंदर की फाइलें हैं। प्रतीक और तार और जो भी अन्य निरंतर डेटा आपके कार्यक्रम की जरूरत है।
बतख बतख

21

यदि डेटा कभी नहीं बदलता है और केवल पढ़ा जाता है , तो बस इसे एक कोड फ़ाइल में स्थिरांक की सूची में रखें।

public readonly string AppStartUpData = "MyAppNeedsThis";

यदि यह डेटा प्रति परिनियोजन अलग है, तो एक बाहरी फ़ाइल ठीक है।

.Net बिल्ट इन .config फाइल्स (App.Config) के साथ आता है। उनमें से सूचनाओं को पढ़ने के लिए मानक तरीकों (ढांचे में निर्मित) के रूप में उन का उपयोग करना चाहिए।

कॉन्फ़िगरेशन की फ़ाइलों का उपयोग करें यदि सेटिंग में बदलाव की आवश्यकता होती है (कभी नहीं कहें तो) क्योंकि वे सिर्फ पाठ फ़ाइलें (एक्सएमएल) हैं। यदि संवेदनशील जानकारी है तो जरूरत पड़ने पर सेटिंग को एन्क्रिप्ट किया जा सकता है।


मैंने स्थिरांक / रीडोनिल के बारे में सोचा, समस्या यह है कि बहुत अधिक डेटा है, इसलिए मुझे लगता है कि मैं बाहरी फ़ाइल के साथ पालन करूंगा। धन्यवाद!
अप्पा यिप यप

5
@schmaedeck ... तो? आप उन परिभाषाओं को एक अलग फ़ाइल में रख सकते हैं और उस एक को आयात कर सकते हैं। वास्तव में मेरा मानना ​​है कि क्यूटी इस तरह की चीजें तब करता है जब फॉर्म और सामान को कंपाइल करता है इसलिए आप स्वचालित रूप से उत्पन्न फ़ाइलों के साथ समाप्त हो जाते हैं, जिसमें कुछ स्थिरांक में बाइनरी डेटा (उदाहरण के चित्र) मेगाबाइट होते हैं, लेकिन अगर यह एक अलग फाइल में है तो इसमें कुछ भी गलत नहीं है। ।
बकरीउ

15

आप हमेशा अपने प्रोजेक्ट में एक फ़ाइल जोड़ सकते हैं और इसके बिल्ड प्रकार को सेट कर सकते हैं Embedded Resourceताकि यह सीधे एप्लिकेशन में ही एम्बेडेड हो।

वैकल्पिक रूप से एक फ़ाइल जो एन्क्रिप्ट की गई है और एक सुलभ स्थान पर रखी गई है।


1
यह सबसे अच्छा जवाब है। मैं इसे प्राप्त करने के लिए कुछ और मार्गदर्शन देखना चाहूंगा। आपको संभावित रूप से परिवर्तनशील कॉन्फ़िगरेशन फ़ाइल का लाभ मिलता है लेकिन इसे स्थिर रखने के लिए मिलता है क्योंकि यह आपके असेंबली में एम्बेडेड है।
9

5

यदि आप नहीं चाहते कि उपयोगकर्ता डेटा पर भी नज़र रखे, तो आपको इसे बाइनरी डेटा फ़ाइल में क्रमांकित करना चाहिए।

केवल ऐप से पढ़ने के लिए विखंडू की लंबाई पता चल जाएगी।

मैं C # नहीं जानता, लेकिन जावा में आप इस तरह से फाइल बनाएंगे:

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

मैं निश्चित रूप से बाइनरी क्रमांकन का उपयोग करूंगा। अपने व़क्त के लिए बहुत - बहुत शुक्रिया!
अप्पा यिप यप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.