2015-01-01 2 views
1

Трудно объяснить, может ли кто-нибудь определить, что не так?Сериализация класса для XML оставляет пустые значения

Я сериализую класс для XML, но одно из свойств (открытый класс в классе) получает пустые значения в XML.

Я создаю свой собственный класс настроек, который я сериализую в XML и десериализую обратно в класс загрузки приложения.

Я поместил точки отладки в метод сохранения, а «ColourScheme» имеет значения, но они гасятся в XML.

public class SettingsModel 
{ 
    // DECLARE: Settings File Location 
    private static string SettingsFilePath = String.Format(@"{0}\{1}\{2}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Typhoeus BluePrint", "BluePrint_Settings.xml"); 

    // DECLARE: Public Settings 
    public DateTime LastUpdated = System.DateTime.Now; 
    public string StylesheetName = "style.css"; 
    public string WebPageName = "index.html"; 
    public string ProjectDirectory = String.Format(@"{0}\{1}\{2}", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Typhoeus BluePrint", "Projects"); 
    public ColourSchemeClass ColourScheme = new ColourSchemeClass(); 

    public SettingsModel() 
    { 

    } 

    public void Save() 
    { 
     LastUpdated = System.DateTime.Now; 

     // DECLARE: File Stream Object 
     FileStream fs = new FileStream(SettingsFilePath, FileMode.OpenOrCreate); 

     // DECLARE: Serialisation Parameters 
     XmlSerializer ClassSerialiser = new XmlSerializer(typeof(SettingsModel)); 

     // SERIALISE: This Class to XML 
     ClassSerialiser.Serialize(fs, this); 

     // CLOSE: File Stream 
     fs.Close(); 
    } 
} 

Здесь представлен цветовой гамме Class

public class ColourSchemeClass 
{ 
    #region Objects 

    // DECLARE: Colour Scheme Properties 
    public Color BaseColour = ColorTranslator.FromHtml("#1E1E1E"); 
    public Color HighlightColour = ColorTranslator.FromHtml("#414141"); 
    public Color SelectedColour = Color.White; 

    #endregion 
    #region Constructors 

    public ColourSchemeClass() 
    { 

    } 
    public ColourSchemeClass (Color Base, Color Highlight, Color Selected) 
    { 
     BaseColour = Base; 
     HighlightColour = Highlight; 
     SelectedColour = Selected; 
    } 

    #endregion 
} 

Вот XML после сериализации. (Extract, потому что я не могу отформатировать его здесь) (Заменено Тэг открыть и закрыть с помощью квадратных скобок)

[ColourScheme] 
[BaseColour/] 
[HighlightColour/] 
[SelectedColour/] 
[/ColourScheme] 
+0

Смотреть это: http://stackoverflow.com/questions/376234/best-solution-for-xmlserializer-and-system-drawing- color –

ответ

1

Color не неизменные (не сеттеры), поэтому он не может быть с пользой сериализуются XmlSerializer. Вы должны ввести прокси-свойство для каждого свойства цвета, например:

[XmlIgnore] 
    public Color BaseColour { get; set; } 

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    [XmlElement("BaseColour")] 
    public string XmlBaseColour 
    { 
     get 
     { 
      return ColorTranslator.ToHtml(BaseColour); 
     } 
     set 
     { 
      BaseColour = ColorTranslator.FromHtml(value); 
     } 
    } 
+0

Спасибо! Я дам это сегодня вечером :) –

+0

Гений, это сработало! Спасибо. Мне было интересно, что означает слово «непреложный» :) –

Смежные вопросы