2016-01-30 28 views
1

當前我正在嘗試編寫一組兩個類:一個(BackgroundManagerSettings)將保存關閉程序時要保存的所有變量,另一個(BackgroundManager)包含方法和只在運行期間需要的變量。Xml僅對基礎對象進行序列化

代碼:

public class BackgroundManager : BackgroundManagerSettings 
    { 
    //Example 
    private string _LastName; 
    public string LastName 
    { 
     get 
     { 
      return this._LastName; 
     } 

     set 
     { 
      this._LastName = value; 
     } 
    } 

    public BackgroundManager() 
    { 
     this.LastName = "Smith"; 
    } 

    public static BackgroundManager Load(string filename) 
    { 
     XmlSerializer Serializer = new XmlSerializer(typeof(BackgroundManager)); 

     LoopAgain: 

     try 
     { 
      using (StreamReader Reader = new StreamReader(filename)) 
      { 
       return Serializer.Deserialize(Reader) as BackgroundManager; 
      } 
     } 
     catch (FileNotFoundException) 
     { 
      using (StreamWriter Writer = new StreamWriter(filename)) 
      { 
       Serializer.Serialize(Writer, new BackgroundManager() as BackgroundManagerSettings); 
       Writer.Close(); 
      } 

      goto LoopAgain; 
     } 
     catch (InvalidOperationException) 
     { 
      File.Delete(filename); 

      goto LoopAgain; 
     } 
    } 

    public void Save(string filename) 
    { 
     XmlSerializer Serializer = new XmlSerializer(typeof(BackgroundManager)); 

     using (StreamWriter Writer = new StreamWriter(filename)) 
     { 
      Serializer.Serialize(Writer, this as BackgroundManagerSettings); 
      Writer.Close(); 
     } 
    } 
} 

public abstract class BackgroundManagerSettings 
{ 
    //Example 
    private string _FirstName; 
    [XmlElement("FirstName")] 
    public string FirstName 
    { 
     get 
     { 
      return this._FirstName; 
     } 

     set 
     { 
      this._FirstName = value; 
     } 
    } 

    public BackgroundManagerSettings() 
    { 
     this.FirstName = "Joe"; 
    } 
} 

用法:

BackgroundManager Manager = BackgroundManager.Load("temp.Xml"); 
Manager.Save("temp.Xml"); 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<BackgroundManager xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <FirstName>Joe</FirstName> 
    <LastName>Smith</LastName> 
</BackgroundManager> 

我現在的問題是,當我使用save()方法將其序列BackgroundManager領域以及BackgroundManagerSettings的字段。我如何製作它只是序列化BackgroundManagerSettings的字段?任何幫助或鏈接指向我在正確的方向將不勝感激。

回答

0

標記您不希望與XmlIgnore屬性序列化的基類的所有公共成員。

+0

這將是我最後的手段。我寧願不必手動設置每個成員。但謝謝你的建議。 – masterterranova

+0

否則,請勿從BackgroundManagerSettings中獲取內容。 –

0

我會做這樣的:

[DataContract] 
public class BackgroundManager : BackgroundManagerSettings 
{ 
    [DataMember] 
    public int PropertyToSerialize { get; set; } 
} 

添加數據成員裝修全部要包含的屬性。

+0

這對於WCF我想。不適用於XmlSerialization –

0

經過一些更多的研究後,我發現了一種方法,它可以用來表達我對它的建議的感謝。

public static BackgroundManager Load(string filename) 
    { 
     XmlSerializer Serializer = new XmlSerializer(typeof(BackgroundManager)); 

     LoopAgain: 

     try 
     { 
      using (StreamReader Reader = new StreamReader(filename)) 
      { 
       return Serializer.Deserialize(Reader) as BackgroundManager; 
      } 
     } 
     catch (FileNotFoundException) 
     { 
      XmlSerializer BaseSerializer = new XmlSerializer(typeof(BackgroundManagerSettings)); 

      using (StreamWriter Writer = new StreamWriter(filename)) 
      { 
       BaseSerializer.Serialize(Writer, new BackgroundManager().ToBase()); 
       Writer.Close(); 
      } 

      goto LoopAgain; 
     } 
     catch (InvalidOperationException) 
     { 
      File.Delete(filename); 

      goto LoopAgain; 
     } 
    } 

    public void Save(string filename) 
    { 
     XmlSerializer Serializer = new XmlSerializer(typeof(BackgroundManagerSettings)); 

     using (StreamWriter Writer = new StreamWriter(filename)) 
     { 
      Serializer.Serialize(Writer, this.ToBase()); 
      Writer.Close(); 
     } 
    } 

    private dynamic ToBase() 
    { 
     var Temp = Activator.CreateInstance(typeof(BackgroundManagerSettings)); 

     FieldInfo[] Fields = Temp.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

     foreach (FieldInfo x in Fields) 
     { 
      x.SetValue(Temp, x.GetValue(this)); 
     } 

     return Temp; 
    }