2011-12-31 31 views
15

Gần đây tôi đã quen với cài đặt ứng dụng C# và có vẻ như rất hay.
Tôi đang tìm cách lưu trữ danh sách các đối tượng tùy chỉnh, nhưng tôi không thể tìm được cách nào!
Thực ra tôi đã thấy một số post to store int[], nhưng không hữu ích cho vấn đề này.
Tôi đã cố gắng thay đổi cấu hình của giải pháp đó để làm cho nó phù hợp với vấn đề của tôi. tệp cấu hình XML trong số đó là:Cách lưu trữ danh sách các đối tượng trong cài đặt ứng dụng

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Tôi đã cố gắng giải quyết đối tượng của mình dưới dạng thuộc tính loại nhưng không hữu ích vì nó không nhận ra đối tượng của tôi ... Tôi đã thử "type = list "và 'type =' tuple []"
cả các tùy chọn này không giúp tôi

tôi có một lớp trông giống như:

class tuple 
    { 
     public tuple() 
     { 
      this.font = new Font ("Microsoft Sans Serif",8); 
      this.backgroundcolor_color = Color.White; 
      this.foregroundcolor_color = Color.Black; 
     } 
     public string log { get; set; } 
     public Font font { get ; set; } 
     public String fontName { get; set; } 
     public string foregroundcolor { get; set; } 
     public Color foregroundcolor_color { get; set; } 
     public string backgroundcolor { get; set; } 
     public Color backgroundcolor_color { get; set; } 
     public Boolean notification { get; set; } 
    } 

và tôi muốn lưu trữ một danh sách trong ứng dụng thiết lập
Vì vậy, có cách nào để đạt được mục đích này.
Cảm ơn bạn trước.
Chúc mừng,

+0

Bản sao có thể có của http://stackoverflow.com/questions/8627887/store-a-range-of-values-in-web-config-what-data-structure-to-use/8627974#8627974 – ivowiblo

+0

lấy một nhìn vào đây http://stackoverflow.com/questions/922047/store-dictionarystring-string-in-application-settings nó có thể giúp bạn ... –

Trả lời

29

Bạn có thể sử dụng BinaryFormatter để sắp xếp tuần tự danh sách các bộ dữ liệu dưới dạng mảng byte và Base64 (theo cách khá hiệu quả) để lưu trữ mảng byte dưới dạng string.

Trước hết thay đổi lớp học của bạn để một cái gì đó như thế (gợi ý: [SerializableAttribute]):

[Serializable()] 
public class tuple 
{ 
    public tuple() 
    { 
     this.font = new Font("Microsoft Sans Serif", 8); 
    //.... 
} 

Thêm bất động sản trong cài đặt tên tuples và loại string.

tuples in Settings

Sau đó, bạn có thể sử dụng hai phương pháp để tải và lưu danh sách chung của các bộ (List<tuple>):

void SaveTuples(List<tuple> tuples) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(ms, tuples); 
     ms.Position = 0; 
     byte[] buffer = new byte[(int)ms.Length]; 
     ms.Read(buffer, 0, buffer.Length); 
     Properties.Settings.Default.tuples = Convert.ToBase64String(buffer); 
     Properties.Settings.Default.Save(); 
    } 
} 

List<tuple> LoadTuples() 
{ 
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples))) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     return (List<tuple>)bf.Deserialize(ms); 
    } 
} 

Ví dụ:

List<tuple> list = new List<tuple>(); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 
list.Add(new tuple()); 

// save list 
SaveTuples(list); 

// load list 
list = LoadTuples(); 

tôi rời null, chuỗi rỗng và ngoại trừ việc kiểm tra bạn.

+0

Tôi tự hỏi tại sao điều này có được downvote, nó sẽ được tốt đẹp để biết những gì là sai. –

+0

Tôi không nghĩ rằng ** sr ** ('StreamReader') trong phương thức' SaveTuples' phục vụ bất kỳ mục đích nào, vì vậy câu lệnh sử dụng thứ hai có thể được xóa một cách an toàn. –

+0

@SaebAmini, bạn nói đúng. Đã sửa :-). –

0

Tôi không chắc chắn những gì bạn muốn làm là thực hiện tốt nhất trong cài đặt ứng dụng. Những gì bạn có thể muốn xem xét là XDocument, và lưu trữ các giá trị bạn cần trong một tập tin cấu hình riêng biệt.

+0

Cảm ơn bạn đã dành thời gian và cân nhắc, bạn có thể vui lòng cho tôi một số gợi ý về XDocument và nó là gì? và những gì bạn đã có nghĩa là bằng cách lưu trữ các giá trị trong một tập tin cấu hình riêng biệt? – Ehsan

+0

XDocument là một trong các lớp để thao tác các tệp xml trong .NET. http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx Nếu bạn thực sự muốn lưu trữ toàn bộ cấu trúc, việc tuần tự hóa XML có thể là đặt cược tốt hơn của bạn. – Hammerstein

0

Bạn có thể viết các loại tùy chỉnh để mở rộng .config tệp. Nhưng điều này sẽ không được lưu trữ các loại tùy ý của riêng bạn trong một phần xác nhận hiện có nhưng thêm các phần tùy chỉnh.

Loại cấu hình tùy chỉnh có thể, bằng cách cung cấp logic tùy chỉnh hoàn toàn cho các nút con, giữ dữ liệu tuần tự hóa XML. Tôi sẽ cho rằng điều này là lạm dụng hệ thống cấu hình: nó là để lưu trữ các thiết lập không hoàn thành nhà nước.

Nếu đây là những gì bạn muốn, có một ví dụ đơn giản trong tài liệu cho ConfigurationSection.

+0

Cảm ơn bạn đã trả lời, nhưng bạn có gợi ý nào để đạt được mục đích này không? để lưu đối tượng này và truy xuất nó sau này? – Ehsan

+0

@Ehsan Xác định lớp tùy chỉnh dựa trên 'ConfigurationSection' với tập hợp thuộc tính phù hợp. Sử dụng 'ConfigurationManager' để tải cấu hình (bao gồm cả cấp độ người dùng) và, sau đó, lưu. – Richard

2

Cấu hình ứng dụng không phải là lựa chọn tốt cho việc lưu trữ dữ liệu khi chạy ứng dụng. Để sử dụng này bất kỳ có sẵn trong .NET tùy chọn serialization như

và nhiều người khác .. .

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