简体   繁体   中英

Export application settings to XML

Following situation:

I have some values saved into my application settings (Properties.Settings) In this settings i have also saved some objects, where the properties of this objects are stored.

Now i want to implement a function to export my settings into a xml file.

for integer values and strings i did it this way:

XmlWriter writer = XmlWriter.Create(path, settings);
writer.WriteStartDocument();
writer.WriteElementString("ServerIP", Settings.Default.ServerIP);
writer.WriteElementString("ServerPort", Settings.Default.ServerPort.ToString());
writer.WriteEndDocument();
writer.Flush();
writer.Close();

Ok.. i hope this is the correct way until now.

Now i need to store my objects into this file.

My idea was to use the XmlSerializer class. But unfortunately i have absolutely no clue how to use it to get the objects combined with the other values in one XML file

in addition here is the code of the class the i want to write to the XML file: http://pastebin.com/PmB4tM7b

In order to use the XML serialization for your objects, you need to decorate your classes or data structures, that hold your classes, with the predefined serialization attributes :

// block of settings like 
// <Service>
//  <Name>Service1</Name>
//  <Description>Starts the service 1</Description>
// </Service>
public class SettingsService
{
    // will be a node in the XML file
    [XmlElement(ElementName="Name")]
    public string Name { get; set; }
    // will be a node too
    [XmlElement(ElementName="Description")]
    public string Description { get; set; }
}

// holds a list of services
// <Services>
//  <Service>...</Service>
//  <Service>...</Service>
// </Services>
public class ServicesSettings
{
    // list of services
    [XmlArray(ElementName="SettingsServices")]
    public List<SettingsService> Services { get; set; }
    // single value!
    [XmlElement(ElementName="SettingsPort")]
    public int PortNumber { get; set; }
}

// serializes the objects to XML file
public void SerializeModels(string filename, ServicesSettings settings)
{
    var xmls = new XmlSerializer(settings.GetType());
    var writer = new StreamWriter(filename);
    xmls.Serialize(writer, settings);
    writer.Close();
}

// retrieves the objects from an XML file
public ServicesSettings DeserializeModels(string filename)
{
    var fs = new FileStream(filename, FileMode.Open);
    var xmls = new XmlSerializer(typeof(WindowsServicesControllerSettings));
    return (WindowsServicesControllerSettings) xmls.Deserialize(fs);
}

Can be used like this:

var service1 = new SettingsService { Name = "Service1", Description = "Blah blah" };
var service2 = new SettingsService { Name = "Service2", Description = "Blah blah blup" };
var services = new List<SettingsService> { service1, service2 };
var settings = new ServicesSettings
{ 
    Services = services,
    PortNumber = 1234
};

this.SerializeModels(@"d:\temp\settings.xml", settings);

This line creates the following XML file:

<?xml version="1.0" encoding="utf-8"?>
<ServicesSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SettingsServices>
    <SettingsService>
      <Name>Service1</Name>
      <Description>Blah blah</Description>
    </SettingsService>
    <SettingsService>
      <Name>Service2</Name>
      <Description>Blah blah blup</Description>
    </SettingsService>
  </SettingsServices>
  <SettingsPort>1234</SettingsPort>
</ServicesSettings>

Retrieving the objects back from the XML file:

var settings = this.DeserializeModels(@"d:\temp\settings.xml");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM