ฉันจะเก็บข้อมูลแบบอ่านอย่างเดียวเพื่อปรับใช้กับแอปพลิเคชันของฉันได้อย่างไร


17

ฉันกำลังพัฒนาแอปพลิเคชันบนเดสก์ท็อปและแอปพลิเคชันนี้ต้องการข้อมูลบางอย่างที่จะเรียกใช้ แต่ไม่เปลี่ยนแปลงข้อมูลใด ๆ (ข้อมูลจะต้องโหลดทุกครั้งที่เรียกใช้แอป แต่ไม่มีการเปลี่ยนแปลงข้อมูล) ข้อมูลจะต้องเก็บไว้ในคอมพิวเตอร์เครื่องเดียวกับที่แอพกำลังทำงานอยู่ (ที่เก็บข้อมูลฝั่งไคลเอ็นต์หรือไม่)

นอกจากนี้ยังเป็นการดีกว่าหากผู้ใช้ไม่สามารถเปลี่ยนข้อมูลนี้ได้อย่างง่ายดาย (สมมติว่าพวกเขาไม่มีความรู้ด้านไอทีมาก)

ฉันจะเก็บข้อมูลประเภทนี้ได้อย่างไร ฐานข้อมูลท้องถิ่น XML ที่ส่งมาพร้อมกับแอปพลิเคชันหรือไม่

ฉันใช้ WPF


2
นี่ไม่ใช่เมตาดาต้า เมตาเป็นเว็บไซต์เพื่อหารือเกี่ยวกับปัญหาหรือข้อสงสัยเกี่ยวกับเว็บไซต์หลักที่มีคำถามถาม
jpmc26

1
ทำไมคุณไม่ต้องการให้ผู้ใช้เปลี่ยนข้อมูล? นั่นคือความกังวลด้านความปลอดภัยหรืออะไร ข้อมูลนี้ควรถูกเก็บเป็นความลับจากผู้ใช้หรือไม่ เหตุผลสามารถเปลี่ยนแปลงคำตอบที่เหมาะสมได้อย่างมากมาย
jpmc26

1
@ jpmc26 เอ่อมันเป็นเรื่องของความปลอดภัย แต่มันไม่ใช่เรื่องใหญ่ วัตถุประสงค์หลักของแอพพลิเคชั่นคือการสื่อสารผ่านพอร์ตอนุกรมกับตัวควบคุมอุณหภูมิ (เช่นนี้ ) และ XML จะเก็บข้อมูลบางอย่างเกี่ยวกับที่อยู่หน่วยความจำของตัวควบคุม หากผู้ใช้แก้ไขอาจทำให้เกิดปัญหาระหว่างการดำเนินการดังนั้นฉันต้องการหลีกเลี่ยง แต่มันเป็นเพียงความกังวลอย่างที่ฉันพูดไม่ใช่เรื่องใหญ่ PS: แก้ไขคำถามเพื่อแทนที่เมตาสำหรับSE ขอบคุณ
appa yip yip

2
ถ้าคุณต้องการฐานข้อมูลท้องถิ่นลองดู SQLite (แต่ถ้าข้อมูลมีขนาดเล็กพอที่จะโหลดลงใน RAM ในการเริ่มต้นฉันชอบไฟล์ที่มีโครงสร้างอย่างเช่น json หรือไบนารีบางอย่าง)
CodesInChaos

1
"หากผู้ใช้แก้ไขอาจทำให้เกิดปัญหาระหว่างการดำเนินการดังนั้นฉันต้องการหลีกเลี่ยง" ไม่ดูเหมือนความกังวลด้านความปลอดภัยเลย ข้อกังวลด้านความปลอดภัยคือสิ่งที่คุณมีข้อความรหัสผ่านหรือคล้ายกันในไฟล์ เพียงแค่ใส่การตั้งค่าในไฟล์ XML ถัดจากไฟล์ที่เรียกใช้งานได้และใส่ความคิดเห็นไว้ด้านบนที่ระบุว่า "อย่าแตะการตั้งค่าในไฟล์นี้ !!" หากผู้ใช้แก้ไขไฟล์สุ่มในไดเรกทอรีการติดตั้งของพวกเขาพวกเขาสมควรได้รับความเสียหายใด ๆ ที่พวกเขาได้รับ
Roger Lipscombe

คำตอบ:


14

ไฟล์ไบนารีจะเป็นคำตอบที่ชัดเจน แต่ขึ้นอยู่กับว่าคุณโหลดมันอย่างไรคุณอาจทำให้ชีวิตง่ายขึ้นถ้าคุณทำได้

XML อาจเป็นตัวเลือกที่ดีเนื่องจากมีวิธีการในภาษา C # สำหรับการอ่านสิ่งนี้ คุณสามารถเพิ่มการตรวจสอบในข้อมูลของคุณเพื่อให้ผู้ใช้แก้ไขการตรวจสอบจะไม่ตรงกันอีกต่อไป (คุณต้องเพิ่มการตรวจสอบเพื่อให้แน่ใจว่าการตรวจสอบที่ถูกต้อง)

ฐานข้อมูลโลคัลอาจสร้างปัญหามากขึ้นเนื่องจากคุณมีการขึ้นต่อกันอื่น ๆ ที่คุณต้องสามารถเข้าถึงได้


ฉันไม่ได้คิดเกี่ยวกับการตรวจสอบมันเป็นความคิดที่ดีจริงๆ ดังนั้นฉันจึงสร้าง checksum และเก็บไว้ในแอปพลิเคชันของฉันดังนั้นทุกครั้งที่ฉัน unserialize XML ฉันจะสร้าง checksum ใหม่และเปรียบเทียบกับอันแรก
appa yip yip

4
หากคุณเก็บเช็คซัมในแอปพลิเคชันคุณจะไม่อนุญาตให้มีการกำหนดค่าที่แตกต่างกันดังนั้นคุณอาจเก็บข้อมูลการกำหนดค่าเป็นแอพพลิเคชั่นค่าคงที่ในรหัสของคุณ หากคุณต้องการเปลี่ยนการกำหนดค่าในอนาคตให้เพิ่มการตรวจสอบ (คำที่ดีกว่าจะเป็น "แฮช") เป็นฟิลด์ของ XML และใช้เพื่อตรวจสอบว่า XML นั้นไม่ได้ถูกแก้ไข แน่นอนผู้โจมตีที่มุ่งมั่นสามารถค้นคว้าโค้ดของคุณค้นหาแฮชลอจิกของคุณและใช้มันเพื่อสร้างไฟล์ XML ที่ถูกต้อง แต่อย่างไรก็ตามแอปพลิเคชันฝั่งไคลเอ็นต์มักจะเสี่ยงต่อการถูกโจมตีที่กำหนด
SJuan76

4
แทนที่จะเป็นไฟล์หรือฐานข้อมูลท้องถิ่นไฟล์ทรัพยากรที่ฝังอยู่ในชุดประกอบจะดีกว่า ซ่อนจากผู้ใช้ปลายทางสามารถจัดการได้ง่ายโดยนักพัฒนา แต่ยังคงเป็นมิตรกับผู้ใช้ หากผลการดำเนินงานเป็นสิ่งที่น่ากังวล
PTwr

@ SJuan76 ใช่ปัญหาของการแฮชบน XML คือมันสามารถเปลี่ยนแปลงได้ถ้ามีคน unserialize อย่างไรก็ตามถ้า XML เปลี่ยนไป (ซึ่งฉันคิดว่ามันจะไม่เกิดขึ้น แต่ใครจะรู้) มันจะเปลี่ยนเฉพาะแอพเวอร์ชันใหม่เท่านั้นดังนั้นเดาว่าฉันจะติดแฮชกับโค๊ด
appa yip yip

2
@schmaedeck: ไฟล์ทรัพยากรเป็นไฟล์ที่อยู่ภายในไบนารีที่สั่งการได้ ไอคอนและสตริงและข้อมูลคงที่อื่น ๆ ที่โปรแกรมของคุณต้องการ
Mooing Duck

21

หากข้อมูลไม่เปลี่ยนแปลงและอ่านได้อย่างเดียวให้ใส่ไว้ในไฟล์รหัสเป็นรายการค่าคงที่

public readonly string AppStartUpData = "MyAppNeedsThis";

หากข้อมูลนี้แตกต่างกันต่อการปรับใช้แสดงว่าไฟล์ภายนอกนั้นใช้ได้

.Net มาพร้อมกับไฟล์. config ในตัว (App.Config) ควรใช้สิ่งเหล่านั้นเนื่องจากมีวิธีมาตรฐาน (สร้างขึ้นในกรอบงาน) เพื่ออ่านข้อมูลจากพวกเขา

ใช้ไฟล์การกำหนดค่าในกรณีที่การตั้งค่าจำเป็นต้องเปลี่ยน (ไม่ต้องบอกว่าไม่เคยใช้) เนื่องจากเป็นเพียงไฟล์ข้อความ (Xml) หากมีข้อมูลที่ละเอียดอ่อนหนึ่งสามารถเข้ารหัสการตั้งค่าหากจำเป็น


ฉันคิดเกี่ยวกับค่าคงที่ / readonlys ปัญหาคือว่ามีข้อมูลจำนวนมากดังนั้นฉันเดาว่าฉันจะติดตามไฟล์ภายนอก ขอขอบคุณ!
appa yip yip

5
@schmaedeck ... เหรอ? คุณสามารถใส่คำจำกัดความเหล่านั้นในไฟล์แยกต่างหากและนำเข้าที่หนึ่ง ในความเป็นจริงฉันเชื่อว่า Qt ทำสิ่งนี้เมื่อรวบรวมแบบฟอร์มและเนื้อหาดังนั้นคุณจะจบลงด้วยไฟล์ที่สร้างขึ้นโดยอัตโนมัติซึ่งมีเมกะไบต์ของข้อมูลไบนารี (เช่นภาพ) ในค่าคงที่บางส่วน แต่ถ้าอยู่ในไฟล์แยกต่างหาก .
Bakuriu

15

คุณสามารถเพิ่มไฟล์ลงในโครงการของคุณและตั้งค่าชนิดการสร้างเป็นEmbedded Resourceเพื่อให้ฝังลงในแอปพลิเคชันโดยตรง

อีกวิธีหนึ่งคือไฟล์ที่เข้ารหัสและวางในตำแหน่งที่สามารถเข้าถึงได้


1
นี่คือคำตอบที่ดีที่สุด ฉันต้องการดูคำแนะนำเพิ่มเติมเกี่ยวกับวิธีการทำให้บรรลุผล คุณได้รับประโยชน์ของไฟล์การกำหนดค่าที่อาจเปลี่ยนแปลงได้ แต่ให้คงที่เมื่อมันถูกฝังในแอสเซมบลีของคุณ
Gusdor

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.