2016-01-30 3 views
1

В настоящее время я пытаюсь написать набор из двух классов: один (BackgroundManagerSettings), который будет содержать все переменные, которые я хочу сохранить, когда программа закрыта, а другая (BackgroundManager), которая содержит методы и переменные, которые понадобятся только во время выполнения.XmlSerializing только базовый объект

код:

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

Else, Не наследуйте от BackgroundManagerSettings. –

0

Я хотел бы сделать это следующим образом:

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

Добавить украшение DataMember на все свойства, которые вы хотите включить.

+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; 
    } 
Смежные вопросы