2010-02-06 68 views
2

我有麻煩序列化對象到XML。序列化對象到XML問題

我有一個類,serializs罰款:

public class GlobalInfo 
{ 
    public string Ripper = ""; 
    public string Lineage = ""; 
} 

我有一個序列化在這裏(GlobalInfoData高於GlobalInfo類的一個實例)

  System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(GlobalInfoData.GetType()); 
      TextWriter w = new StreamWriter(Application.StartupPath + @"\GlobalInfo.xml"); 
      x.Serialize(w, GlobalInfoData); 
      w.Close(); 

能正常工作的代碼。

我然後有另一個類:

public class Settings 
{ 
    public delegate void SettingsChangedHandler(object sender, EventArgs e); 
    public event SettingsChangedHandler SettingsChanged; 

    #region SoX 
    private string sox_path; 
    public string SOX_PATH { get { return sox_path; } } 

    private string sox_version; 
    public string SOX_VERSION { get { return sox_version; } } 

    public bool SetSOXPath(string soxpath) 
    { 

     string sox_result = ValidateSOX(soxpath); 
     if (sox_result != null) 
     { 
      sox_path = soxpath; 
      sox_version = sox_result; 
      return true; 
     } 
     else 
     { 
      sox_path = ""; 
      sox_version = ""; 
      return false; 
     } 
    } 

    public string ValidateSOX(string soxpath) 
    { 
     if (Path.GetFileName(soxpath).ToUpper() == "SOX.EXE") 
     { 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.EnableRaisingEvents = false; 
      proc.StartInfo.FileName = soxpath; 
      proc.StartInfo.Arguments = "--version"; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.Start(); 

      string output = proc.StandardOutput.ReadToEnd(); 
      proc.WaitForExit(); 

      if (output.Contains("sox: SoX v") == true) 
      { 
       int i = output.IndexOf("sox: SoX v"); 
       string version = output.Substring(i + 10); 
       return version; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     else 
      return null; 
    } 
    #endregion 

    #region LAME 
    private string lame_path; 
    public string LAME_PATH { get { return lame_path; } } 

    public bool SetLAMEPath(string lamepath) 
    { 
     if (ValidateLAME(lamepath) == true) 
     { 
      lame_path = lamepath; 
      return true; 
     } 
     else 
     { 
      lame_path = ""; 
      return false; 
     } 
    } 

    public bool ValidateLAME(string lamepath) 
    { 
     if (Path.GetFileName(lamepath).ToUpper() == "LAME.EXE") 
     { 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.EnableRaisingEvents = false; 
      proc.StartInfo.FileName = lamepath; 
      proc.StartInfo.RedirectStandardError = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.Start(); 

      string output = proc.StandardError.ReadLine(); 
      proc.WaitForExit(); 

      if (output.StartsWith("LAME") == true) 
       return true; 
      else 
       return false; 
     } 
     else 
      return false; 
    } 


    private string flac_path; 
    public string FLAC_PATH { get { return flac_path; } } 

    private string default_dir; 
    public string DEFAULT_DIR { get { return default_dir; } } 
    #endregion 

    #region FLAC 
    public bool SetFLACPath(string flacpath) 
    { 
     if (ValidateFLAC(flacpath) == true) 
     { 
      flac_path = flacpath; 
      return true; 
     } 
     else 
     { 
      flac_path = ""; 
      return false; 
     } 
    } 


    public bool ValidateFLAC(string flacpath) 
    { 
     if (Path.GetFileName(flacpath).ToUpper() == "FLAC.EXE") 
     { 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
      proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      proc.StartInfo.CreateNoWindow = true; 
      proc.EnableRaisingEvents = false; 
      proc.StartInfo.FileName = flacpath; 
      proc.StartInfo.Arguments = "-v"; 
      proc.StartInfo.RedirectStandardOutput = true; 
      proc.StartInfo.UseShellExecute = false; 
      proc.Start(); 

      string output = proc.StandardOutput.ReadToEnd(); 
      proc.WaitForExit(); 

      if (output.StartsWith("flac") == true) 
       return true; 
      else 
       return false; 
     } 
     else 
      return false; 
    } 

    public bool SaveSettings() 
    { 
     return true; 
    } 

    public bool LoadSettings() 
    { 
     return true; 
    } 
    #endregion 



} 

和序列化它的代碼(設定是上述設置的類的實例)

//Serialization 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(Settings.GetType()); 
     TextWriter w = new StreamWriter(settingspath); 
     x.Serialize(w, Settings); 
     w.Close(); 

這只是創建包含XML頭的XML文件但沒有數據。我究竟做錯了什麼? 謝謝!

回答

3

您需要讀取/寫入屬性。

事實上,從MSDN:http://msdn.microsoft.com/en-us/library/bdxxw552.aspx

serialize方法轉換公共字段和讀取的對象的/寫屬性爲XML。它不會轉換方法,索引器,專用字段或只讀屬性。要序列化公共和私有對象的所有字段和屬性,請使用BinaryFormatter。

+0

啊好吧是的我只想保存存儲的值,所以我應該只爲保存公共數據和導入/導出一個類? – Dave 2010-02-06 00:28:11

+0

@Dave:是的,你可以做到這一點。你有你工作的*工作班;當你準備保存時,你可以實例化並設置公共屬性並通過XmlSerializer運行。但是,如果您使用適當的公共獲取/設置字段/屬性創建* working *類,那並不是真的必要。在不需要XmlSerializer的公共字段上使用'[XmlIgnore]'。 – IAbstract 2010-02-06 00:41:51

0

要使XML序列化起作用,您需要get和setters。你只有SOX_PATH和SOX_PATH的getters。

沒有這些,它不能將對象從XML反序列化。