2011-12-31 18 views
15

Kısa süre önce C# uygulama ayarları hakkında bilgi sahibi oldum ve gayet iyi görünüyor.
Özel nesnelerin listesini depolamak için bir yol arıyordum, ama bir yol bulamadım!
Aslında bir post to store int[] gördüm, ancak bu sorun için yararlı olmadı.
Sorunuma uygun hale getirmek için bu çözümün yapılandırmasını değiştirmeye çalıştım. Bunun XML yapılandırma dosyası oldu:Uygulama ayarlarında nesne listesi nasıl saklanır

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

tip özelliğinde aşağıda alıntılanan ama benim nesne tanıma olmadığından yararlı değildi benim nesneyi seslenmeye çalıştı ... Denedim "type = Liste "ve 'type =' tanımlama grubu []"
bu seçeneklerin her ikisi bana yardım etmedi

ben böyle bir sınıf görünüyor vardır:! Ben uygulamasında bir liste saklamak istediğiniz

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; } 
    } 

ve
Yani Bu amaca ulaşmak için herhangi bir yol var.
Önceden teşekkürler.
Şerefe,

+0

http://stackoverflow.com/questions/8627887/store-a-range-of-values-in-web-config-what-data-structure-to-use/8627974#8627974 – ivowiblo

+0

'un bir kopyasını alın Burada bakmak http://stackoverflow.com/questions/922047/store-dictionarystring-string-in-application-settings size yardımcı olabilir ... –

cevap

29

Bayt dizisini string olarak depolamak için bayt dizisi ve Base64 (oldukça verimli bir yol) olarak tuple listesini serileştirmek için BinaryFormatter'u kullanabilirsiniz.(: [SerializableAttribute] ipucu): Her şeyden

İlk böyle bir şey için sınıf değiştirmek

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

string ait tuples ve türünü adlı ayarlarında özellik ekleyin.

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

Örnek:

tuples in Settings

Sonra yüklemek ve dizilerini jenerik listesi (List<tuple>) kurtarmak için iki yöntem kullanabilirsiniz ben null terk

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

, boş dize ve istisna kontrol sizde.

+0

Niçin bu durumun düştüğünü merak ediyorum, neyin yanlış olduğunu bilmek güzel olurdu. –

+0

"SaveTuples" yöntemindeki ** sr ** ('StreamReader') 'ın herhangi bir amaca hizmet ettiğini sanmıyorum, bu nedenle ikinci kullanım deyimi güvenli bir şekilde kaldırılabilir. –

+0

@SaebAmini, haklısınız. Düzeltilmiş :-) –

0

Ne yapmak istediğinizin en iyi uygulama ayarlarında yapıldığından emin değilim. Bakmak isteyebileceğiniz şey XDocument ve ihtiyacınız olan değerleri ayrı bir yapılandırma dosyasında saklamak.

+0

Zaman ayırdığınız için teşekkürler ve XDocument hakkında bazı ipuçları verebilir misiniz? ve nedir? ve değerleri ayrı bir yapılandırma dosyasında saklayarak ne demek istediniz? – Ehsan

+0

XDocument, .NET içindeki xml dosyalarını işlemek için kullanılan sınıflardan biridir. http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx Eğer aslında tüm yapıyı saklamak istiyorsanız, XML serileştirme daha iyi bir bahis olabilir. – Hammerstein

0

.config dosyalarını genişletmek için özel türler yazabilirsiniz. Ancak bu, mevcut bir onaylama bölümünde kendi özel türlerinizi kaydetmeyecek, ancak özel bölümler ekleyecektir.

Özel bir yapılandırma tipi, alt düğümlerinde tamamen özel mantık sağlayarak, XML seri hale getirilmiş verileri tutmak olabilir. Bunun konfigürasyon sistemini kötüye kullandığını ileri süreceğim: bu ayarların eksiksiz durumda değil depolanması içindir. İstediğin bu ise

, ConfigurationSection belgelerinde basit bir örnek vardır.

+0

Yanıtınız için teşekkürler, ancak bu amaca ulaşmak için herhangi bir öneriniz var mı? Bu nesneyi kaydetmek ve daha sonra almak için? – Ehsan

+0

@Ehsan Sağ taraf özellikleriyle 'ConfigurationSection 'temel alınarak özel bir sınıf tanımlayın. Yapılandırmayı (kullanıcı seviyeleri dahil) yüklemek ve daha sonra kaydetmek için 'ConfigurationManager'ı kullanın. – Richard

2

Uygulama yapılandırması uygulama zamanında verileri depolamak için iyi bir seçenek değildir. Bazı embedde veritabanı Sqlite

ve diğerleri için proto-buf

  • Json serialization
  • ORM haritalama ile

    • Xml Serialization
    • Ikili seri gibi .NET seri seçeneğinde hiçbir kullanılabilir Bu kullanım için ..