title: Add a collection of a custom class to Settings.Settings
body: <p>I've been having a helluva time trying to add a custom collection of a custom class to the application settings of my winforms project I feel like Ive tried it about six different ways, including <a href="http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file" rel="noreferrer">this way</a>, <a href="http://msdn.microsoft.com/en-us/library/ty01x675%28v=vs.80%29.aspx" rel="noreferrer">this way</a>, <a href="https://stackoverflow.com/questions/1321248/how-do-i-save-serialize-a-custom-class-to-the-settings-file">this way</a>, and <a href="http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/aa13ecaf-07a5-4833-bd0c-2cb73e5235dc" rel="noreferrer">this way</a> but nothing seems to work...  </p>
  
  <p>Currently the code complies, and runs fine - no exceptions anywhere.  Code his the Save function but no entries are created in the settings xml file (I have a few other settings and it works for all of them but this one FYI).  When it loads, <code>Properties.Settings.Default.LastSearches</code> is always null... Any thoughts?</p>
  
  <p>Heres my current code:</p>
  
  <p><strong>The Classes:</strong></p>
  
  <pre><code>[Serializable]
  public class LastSearch : ISerializable
  {
      public DateTime Date { get; set; }
      public string Hour { get; set; }
      public string Log { get; set; }
      public string Command { get; set; }
      public List&lt;string&gt; SelectedFilters { get; set; }
      public List&lt;string&gt; SearchTerms { get; set; }
      public List&lt;string&gt; HighlightedTerms { get; set; }
      public List&lt;string&gt; ExcludedTerms { get; set; }
  
      public LastSearch(DateTime date, string hour, string log, string command, List&lt;string&gt; selectedFilters,
          List&lt;string&gt; searchTerms, List&lt;string&gt; highlightedTerms, List&lt;string&gt; excludedTerms)
      {
          Date = date.ToUniversalTime();
          Hour = hour;
          Log = log;
          Command = command;
          SelectedFilters = selectedFilters;
          SearchTerms = searchTerms;
          HighlightedTerms = highlightedTerms;
          ExcludedTerms = excludedTerms;
      }
  
      protected LastSearch(SerializationInfo info, StreamingContext context)
      {
          Date = info.GetDateTime("Date");
          Hour = info.GetString("Hour");
          Log = info.GetString("Log");
          Command = info.GetString("Command");
          SelectedFilters = (List&lt;string&gt;)info.GetValue("SelectedFilters", typeof(List&lt;string&gt;));
          SearchTerms = (List&lt;string&gt;)info.GetValue("SearchTerms", typeof(List&lt;string&gt;));
          HighlightedTerms = (List&lt;string&gt;)info.GetValue("HighlightedTerms", typeof(List&lt;string&gt;));
          ExcludedTerms = (List&lt;string&gt;)info.GetValue("ExcludedTerms", typeof(List&lt;string&gt;));
      }
      [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
  
      public void GetObjectData(SerializationInfo info, StreamingContext context)
      {
          info.AddValue("Date", Date);
          info.AddValue("Hour", Hour);
          info.AddValue("Log", Log);
          info.AddValue("Command", Command);
          info.AddValue("SelectedFilters", SelectedFilters);
          info.AddValue("SearchTerms", SearchTerms);
          info.AddValue("HighlightedTerms", HighlightedTerms);
          info.AddValue("ExcludedTerms", ExcludedTerms);
      }
  }
  
  [Serializable]
  public class LastSearchCollection : ISerializable
  {
      public List&lt;LastSearch&gt; Searches { get; set; }
  
      public LastSearchCollection()
      {
          Searches = new List&lt;LastSearch&gt;();
      }
  
      public LastSearchCollection(SerializationInfo info, StreamingContext ctxt)
      {
          Searches = (List&lt;LastSearch&gt;)info.GetValue("LastSearches", typeof(List&lt;LastSearch&gt;));
      }
      [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
  
      public void GetObjectData(SerializationInfo info, StreamingContext context)
      {
          info.AddValue("Searches", Searches);
      }
  }
  </code></pre>
  
  <p><strong>Writing to Settings:</strong></p>
  
  <pre><code>if (RecentQueriesToolStripMenuItem.DropDownItems.Count &gt; 0)
  {
      // Last Search Settings
      if (Properties.Settings.Default.LastSearches == null)
          Properties.Settings.Default.LastSearches = new LastSearchCollection();
  
      Properties.Settings.Default.LastSearches.Searches.Clear();
      foreach (LastSearchMenuItem item in RecentQueriesToolStripMenuItem.DropDownItems)
      {
          Properties.Settings.Default.LastSearches.Searches.Add(item.SearchData);
      }
  }
  
  // Save all settings
  Properties.Settings.Default.Save();
  </code></pre>
  
  <p><strong>Loading from setttings</strong></p>
  
  <pre><code>// Last Searches
  if (Properties.Settings.Default.LastSearches != null)
  {
      int i = 0;
      foreach (LastSearch search in Properties.Settings.Default.LastSearches.Searches)
      {
          LastSearchMenuItem searchMenuItem = new LastSearchMenuItem(search);
          RecentQueriesToolStripMenuItem.DropDownItems.Add(searchMenuItem);
          RecentQueriesToolStripMenuItem.DropDownItems[i].Click += new EventHandler(RecentSearch_Click);
          i++;
      }
  }
  </code></pre>