2013-02-19 24 views
5

Để cung cấp một chút nền.Thực hành mã hóa tốt khi lưu dữ liệu vào tệp .net

Tôi đã tạo một ứng dụng cho phép người dùng lưu cài đặt và sau đó gọi lại cài đặt sau này. Để làm điều này tôi đã tạo ra một số đối tượng serializable. Tôi đã nhận được điều này để làm việc bằng cách sử dụng BinaryFormatter mà không gặp rắc rối nhiều.

Nơi tôi bắt đầu gặp sự cố là khi tôi nâng cấp phần mềm và thêm cài đặt mới. Bây giờ các đối tượng serializable của tôi không khớp và vì vậy tôi phải cập nhật các tập tin. Tôi đã làm điều này thành công cho một vài phiên bản. Nhưng để làm điều này tôi cố gắng deserializing các tập tin và nếu nó ném một ngoại lệ, tôi cố gắng với phiên bản tiếp theo. . .và sau đó tiếp theo. . .và sau đó tiếp theo. . . cho đến khi tôi tìm được cái đúng. Sau đó, tôi phải viết các chức năng chuyển đổi cho mỗi phiên bản cũ để chuyển đổi nó thành phiên bản mới nhất. Tôi cũng đã tạo một tệp "sửa đổi", vì vậy tôi chỉ có thể kiểm tra phiên bản trước và sau đó nâng cấp nó, nhưng tôi vẫn phải giữ rất nhiều "phiên bản" khác nhau và viết các chức năng chuyển đổi cho tất cả chúng . . . mà dường như vốn đã lộn xộn với tôi và dễ bị sưng lên sau này xuống dòng nếu tôi tiếp tục đi tuyến đường này.

Phải có cách tốt hơn để làm điều này, tôi không chắc chắn như thế nào.

Cảm ơn

+0

Có chức năng dựng sẵn trong khung .net, bắt đầu bằng phiên bản 2, thực hiện chính xác những gì bạn muốn mà không cần phải viết mã của riêng bạn. Vui lòng xem câu trả lời của tôi bên dưới. – Andy

Trả lời

3

Bạn cần phải viết một serialization binder các assembly.

Đối với cài đặt, tôi sử dụng Dictionary<string, byte[]> để lưu vào tệp. Tôi sắp xếp lại từ điển và tất cả đều tốt. Khi tôi thêm cài đặt mới, tôi cung cấp cài đặt mặc định nếu không tìm thấy trong tệp cài đặt.

Ngoài ra, nếu bạn đang thêm trường vào đối tượng được tuần tự hóa, bạn có thể trang trí bằng [Tùy chọn].

0

thực sự điều này có thể được thực hiện bằng cách thêm thuộc tính [DefaultValue()] vào các thuộc tính mới hơn trên các đối tượng cài đặt của bạn - ít nhất là cho tuần tự hóa XML. Tôi đã không cố gắng này bằng cách sử dụng serialzation nhị phân. Đối với xml, điều này có nghĩa rằng chúng là "tùy chọn" và tuần tự hóa sẽ không bị hỏng khi tải phiên bản cũ của tệp. Bạn có thể tìm thuộc tính này trong không gian tên System.ComponentModel như vậy;

class MySettings 
{ 
    public int MaxNumLogins { get; set; } 

    // specify the value to default to if it's not present in the serialized file... 
    [DefaultValue(0)] 
    public int CacheTimeoutMinutes { get; set; } 
} 
+0

Serialize nhị phân là nhiều hơn nữa picky hơn XML serializes, tôi không nghĩ rằng nó sẽ làm việc. –

0

Ngoài đặt tên cho các lĩnh vực như những người khác đã gợi ý các loại điều này chỉ khóc ra cho số phiên bản.

2

Đây chính xác là những gì lớp Cài đặt dành cho. Bạn xác định giá trị mặc định trong app.config của mình và sau đó người dùng có thể thay đổi chúng và khi bạn lưu, thay đổi của chúng sẽ lưu vào vị trí trong hồ sơ người dùng của chúng. Khi bạn đọc chúng, bạn sẽ chỉ nhận được các cài đặt đã sửa đổi.

Liên kết này là dành cho VS 2005, nhưng nó hoạt động giống hệt nhau trong VS 2012: http://msdn.microsoft.com/en-us/library/aa730869(v=vs.80).aspx

Tìm thấy liên kết cho VS2012: http://msdn.microsoft.com/EN-US/library/k4s6c3a0(v=VS.110,d=hv.2).aspx

+0

Tốt để biết, cảm ơn. Đây không phải là những gì tôi cần, nhưng có lẽ tôi sẽ sử dụng nó trong tương lai. – EatATaco

+0

@EatATaco Không có gì trong câu hỏi của bạn khiến tôi nghĩ rằng bạn đang làm điều gì đó mà chức năng tích hợp không cung cấp, do đó, có vẻ như tôi đang tái phát minh ra bánh xe. Có thể bạn có thể cập nhật câu hỏi của mình để chúng tôi có thể biết lý do cài đặt tích hợp không phù hợp với điều này. – Andy

0

Bạn có thể có một cái nhìn tại Protobuf-Net http://code.google.com/p/protobuf-net/wiki/GettingStarted nếu bạn là làm nhị phân bởi vì tất cả những điều này được bảo hiểm liên quan đến phiên bản vv Nó cũng rất nhỏ gọn. Nó cũng được tích cực phát triển và nếu bạn có khả năng có yêu cầu nền tảng chéo nếu bạn sử dụng một tập tin .proto bạn cũng có thể đạt được điều đó.

Nếu bạn muốn mọi người có thể chỉnh sửa cài đặt (bên ngoài chương trình của bạn) thì bạn có thể sử dụng các phương pháp xê-ri hóa XML *.

1

Định dạng XML là dành cho những trường hợp như vậy. Bạn sẽ tìm thấy các cài đặt cũ cần thiết trong phiên bản cài đặt rất sớm. Và ngay cả phiên bản cũ cũng có thể xử lý các cài đặt XML được tạo từ phiên bản mới hơn. Nó không hoạt động "tự động" tức là với phương thức như Serialize/Deserialize, nhưng việc viết các hàm chuyển đổi không dễ dàng hơn hoặc nhanh hơn.

Các vấn đề liên quan