2011-12-31 22 views
15

Niedawno zapoznałem się z ustawieniami aplikacji C# i wydaje mi się, że jest fajnie.
Szukałem sposobu na zapisanie listy niestandardowych obiektów, ale nie mogłem znaleźć sposobu!
Właściwie widziałem post to store int[], ale nie było pomocne w tym problemie.
Próbowałem zmienić konfigurację tego rozwiązania, aby było odpowiednie dla mojego problemu. plik XML config tego było:Jak przechowywać listę obiektów w ustawieniach aplikacji

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

Próbowałem rozwiązać mojego obiektu cytowany poniżej atrybutu type, ale nie było pomocne, gdyż nie uznając mojego obiektu ... Próbowałem „type = Lista „i«type =»krotka []”
obu tych opcji mi nie pomoże

mam klasy wygląda następująco:

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

i chcę do przechowywania listy w aplikacji! Ustawienie:
Tak jest istnieje jakikolwiek sposób osiągnięcia tego celu.
Z góry dziękuję.
Pozdrowienia,

+0

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

+0

spójrz na http://stackoverflow.com/questions/922047/store-dictionarystring-string-in-application-settings to może być pomocne ... –

Odpowiedz

29

Możesz użyć BinaryFormatter do serializowania listy krotek jako tablicy bajtów i Base64 (jako dość efektywny sposób) do przechowywania tablicy bajtów jako string.

Przede wszystkim zmienić klasę na coś takiego (wskazówka: [SerializableAttribute]):

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

Dodaj nieruchomość w ustawieniach nazwanych tuples i rodzaj string.

tuples in Settings

Następnie można użyć dwóch metod, aby załadować i zapisać ogólną listę krotek (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); 
    } 
} 

Przykład:

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

zostawiam null, pusty łańcuch i wyjątek sprawdzający do ciebie.

+0

Zastanawiam się, dlaczego tak się stało, dobrze byłoby wiedzieć, co jest nie tak. –

+0

Nie sądzę, że ** sr ** ('StreamReader') w metodzie' SaveTuples' ma jakikolwiek cel, więc druga instrukcja użycia może zostać bezpiecznie usunięta. –

+0

@Sebebmin, masz rację. Poprawiono :-). –

0

Nie jestem pewien, co chcesz zrobić, najlepiej zrobić w ustawieniach aplikacji. To, co możesz chcieć zajrzeć, to XDocument i zapisywanie wartości, których potrzebujesz w osobnym pliku konfiguracyjnym.

+0

Dziękuję za poświęcony czas i uwagę, proszę o wskazówki dotyczące XDocument i co to jest? i co masz na myśli zapisując wartości w osobnym pliku konfiguracyjnym? – Ehsan

+0

XDocument to jedna z klas do manipulowania plikami xml w .NET. http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx Jeśli rzeczywiście chcesz przechowywać całą strukturę, serializacja XML może być lepszym rozwiązaniem. – Hammerstein

0

Można pisać typy niestandardowe w celu rozszerzenia plików .config. Nie będzie to jednak przechowywanie własnych arbitralnych typów w istniejącej sekcji potwierdzenia, ale dodawanie niestandardowych sekcji.

Niestandardowy typ konfiguracji może, zapewniając całkowicie niestandardową logikę węzłów potomnych, przechowywać dane serializowane XML. Twierdzę, że to nadużywa systemu konfiguracji: służy do przechowywania ustawień nie jest kompletny.

Jeśli tego chcesz, istnieje prosty przykład w dokumentacji dla ConfigurationSection.

+0

Dziękuję za odpowiedź, ale czy masz jakieś sugestie, aby osiągnąć ten cel? zapisać ten obiekt i pobrać go później? – Ehsan

+0

@Ehsan Zdefiniuj niestandardową klasę opartą na 'ConfigurationSection' z odpowiednim zestawem właściwości. Użyj 'ConfigurationManager', aby załadować config (w tym poziomy użytkownika), a następnie zapisać. – Richard

2

Konfiguracja aplikacji nie jest dobrym wyborem do przechowywania danych w czasie wykonywania aplikacji. Dla tego zastosowania dowolnego dostępnego w .NET opcji serializacji jak

i wiele innych ..

Powiązane problemy