Tôi nên lưu trữ dữ liệu chỉ đọc để triển khai với ứng dụng của mình như thế nào?


17

Tôi đang phát triển một ứng dụng máy tính để bàn và ứng dụng này yêu cầu một số thông tin để chạy, nhưng nó không thay đổi bất kỳ thông tin nào (dữ liệu phải được tải trên mỗi lần thực hiện ứng dụng, nhưng dữ liệu không bao giờ thay đổi). Dữ liệu phải được lưu trữ trên cùng một máy tính khi ứng dụng đang chạy (lưu trữ phía máy khách?).

Cũng tốt hơn nếu người dùng không thể dễ dàng thay đổi thông tin này (giả sử rằng họ không có nhiều kiến ​​thức về CNTT).

Làm thế nào tôi nên lưu trữ loại thông tin này? Một cơ sở dữ liệu địa phương? XML được gửi cùng với ứng dụng?

Tôi đang sử dụng WPF.


2
Đây không phải là một meta. Một meta là một trang web để thảo luận về các vấn đề hoặc mối quan tâm về các trang web chính nơi các câu hỏi được đặt ra.
jpmc26

1
Tại sao bạn không muốn người dùng thay đổi thông tin? Đó có phải là một mối quan tâm an ninh hay không? Thông tin này có được giữ bí mật với người dùng không? Những lý do có thể thay đổi lớn những gì câu trả lời là phù hợp.
jpmc26

1
@ jpmc26 Vâng, đó là loại một mối quan tâm an ninh, nhưng nó không phải là một vấn đề lớn. Mục tiêu chính của ứng dụng là giao tiếp qua một cổng nối tiếp với bộ điều khiển nhiệt độ (như cái này ) và XML sẽ lưu trữ một số thông tin về các địa chỉ bộ nhớ của bộ điều khiển. Nếu người dùng thay đổi nó, nó có thể gây ra vấn đề trong quá trình thực thi, vì vậy tôi muốn tránh nó. Nhưng nó chỉ là một mối quan tâm, như tôi đã nói, không phải là một vấn đề lớn. ps: chỉnh sửa câu hỏi để thay thế meta cho SE . Cảm ơn.
appa yip yip

2
Nếu bạn muốn có một cơ sở dữ liệu cục bộ, hãy xem SQLite. (Nhưng nếu dữ liệu đủ nhỏ để tải vào RAM khi khởi động, tôi thích một tệp có cấu trúc đơn giản như json hoặc thứ gì đó nhị phân)
CodeInChaos

1
"Nếu người dùng thay đổi nó, nó có thể gây ra vấn đề trong quá trình thực thi, vì vậy tôi muốn tránh nó." không có vẻ như là một mối quan tâm an ninh cả. Một mối quan tâm bảo mật là một trong đó bạn có một cụm mật khẩu hoặc tương tự trong tệp. Chỉ cần đặt các cài đặt trong một tệp XML bên cạnh tệp thực thi và đặt một nhận xét ở trên cùng có nội dung "Không chạm vào các cài đặt trong tệp này !!". Nếu người dùng chỉnh sửa các tệp ngẫu nhiên trong thư mục cài đặt của bạn, thì họ xứng đáng với bất kỳ sự cố nào họ nhận được.
Roger Lipscombe

Câu trả lời:


14

Một tệp nhị phân sẽ là câu trả lời rõ ràng, nhưng nó phụ thuộc vào cách bạn tải nó - bạn cũng có thể làm cho cuộc sống của mình trở nên dễ dàng nếu bạn có thể.

XML có thể là một lựa chọn tốt vì có các phương thức được xây dựng trong C # để đọc này. Bạn có thể thêm một tổng kiểm tra vào dữ liệu của mình để nếu người dùng thay đổi nó, tổng kiểm tra sẽ không còn phù hợp nữa (bạn cần thêm một kiểm tra để đảm bảo tổng kiểm tra hợp lệ)

Một db cục bộ có thể tạo ra nhiều vấn đề hơn vì bạn có các phụ thuộc khác mà bạn cần để có thể truy cập nó


Tôi đã không nghĩ về tổng kiểm tra, đó là một ý tưởng thực sự tốt đẹp. Vì vậy, tôi tạo một tổng kiểm tra và lưu trữ nó trên ứng dụng của mình, vì vậy mỗi lần tôi hủy xác định XML, tôi sẽ tạo một tổng kiểm tra mới và so sánh nó với lần đầu tiên?
appa yip yip

4
Nếu bạn lưu trữ tổng kiểm tra trong ứng dụng, bạn sẽ không bao giờ cho phép cấu hình khác, do đó bạn cũng có thể lưu trữ dữ liệu cấu hình dưới dạng hằng số ứng dụng trong mã của mình. Nếu bạn muốn có thể thay đổi cấu hình trong tương lai, hãy thêm tổng kiểm tra (thuật ngữ tốt hơn sẽ là "hàm băm") làm trường của XML và sử dụng nó để xác minh XML chưa bị giả mạo. Tất nhiên, một kẻ tấn công xác định có thể nghiên cứu mã của bạn, tìm logic băm của bạn và sử dụng nó để tạo các tệp XML hợp lệ, nhưng dù sao các ứng dụng phía máy khách luôn dễ bị tấn công bởi những kẻ tấn công được xác định.
SJuan76

4
Thay vì tệp hoặc db cục bộ, tệp tài nguyên được nhúng trong cụm sẽ tốt hơn. Ẩn từ người dùng cuối, dễ dàng quản lý bởi nhà phát triển nhưng vẫn thân thiện với người dùng. Nếu hiệu suất là một mối quan tâm, thì tuần tự nhị phân sẽ vượt trội.
PTwr

@ SJuan76 Vâng, vấn đề của hàm băm trên XML là nó có thể được thay đổi nếu ai đó không xác nhận nó. Dù sao, nếu thay đổi XML (mà tôi nghĩ nó sẽ không xảy ra, nhưng ai biết được) thì nó sẽ chỉ thay đổi trên một phiên bản mới của ứng dụng, vì vậy hãy đoán tôi sẽ gắn bó với mã băm.
appa yip yip

2
@schmaedeck: Các tệp tài nguyên là các tệp theo nghĩa đen bên trong tệp nhị phân thực thi. Biểu tượng và chuỗi và bất kỳ dữ liệu không đổi khác mà chương trình của bạn cần.
Vịt mướp

21

Nếu dữ liệu không bao giờ thay đổi và chỉ được đọc , thì chỉ cần đặt nó vào một tệp mã dưới dạng một danh sách các hằng số.

public readonly string AppStartUpData = "MyAppNeedsThis";

Nếu dữ liệu này là khác nhau cho mỗi lần triển khai, thì một tệp bên ngoài là tốt.

.Net đi kèm với các tệp .config tích hợp (App.Config). Người ta nên sử dụng những cách đó vì có những cách tiêu chuẩn (được xây dựng trong khung) để đọc thông tin từ chúng.

Sử dụng các tệp cấu hình trong trường hợp cài đặt cần thay đổi (không bao giờ nói không bao giờ) vì chúng chỉ là tệp văn bản (Xml). Nếu có thông tin nhạy cảm, người ta có thể mã hóa một cài đặt nếu cần.


Tôi đã nghĩ về các hằng số / chỉ đọc, vấn đề là có rất nhiều dữ liệu, vì vậy tôi đoán tôi sẽ theo dõi với tệp bên ngoài. Cảm ơn bạn!
appa yip yip

5
@schmaedeck ... vậy sao? Bạn có thể đặt các định nghĩa đó vào một tệp riêng biệt và nhập định nghĩa đó. Trên thực tế tôi tin rằng Qt thực hiện loại việc này khi biên dịch các biểu mẫu và nội dung để bạn kết thúc với các tệp được tạo tự động có megabyte dữ liệu nhị phân (ví dụ: hình ảnh) trong một số hằng, nhưng nếu nó nằm trong một tệp riêng thì không có gì sai cả .
Bakuriu

15

Bạn luôn có thể thêm một tệp vào dự án của mình và đặt loại bản dựng của nó để Embedded Resourcenó được nhúng trực tiếp vào chính ứng dụng.

Ngoài ra, một tập tin được mã hóa và được đặt ở một vị trí có thể truy cập.


1
Đây là câu trả lời tốt nhất. Tôi muốn xem thêm một số hướng dẫn về cách đạt được nó. Bạn nhận được những lợi ích của một tệp cấu hình có khả năng thay đổi nhưng phải giữ cho nó tĩnh khi nó được nhúng trong cụm của bạn.
Gusdor

5

Nếu bạn không muốn người dùng thậm chí nhìn trộm dữ liệu, bạn nên tuần tự hóa nó thành một tệp dữ liệu nhị phân.

Chỉ có ứng dụng mới biết chiều dài của các đoạn để đọc từ nó.

Tôi không biết C # nhưng trong Java bạn sẽ tạo tệp như thế này:

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

... và họ đọc nó như thế này:

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

Tôi chắc chắn sẽ sử dụng tuần tự nhị phân. Cảm ơn rất nhiều thời gian của bạn!
appa yip yip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.