Laden...

xml deserialisieren

Erstellt von sindibad vor 3 Jahren Letzter Beitrag vor 3 Jahren 404 Views
S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 3 Jahren
xml deserialisieren

ich habe folgendes XML


<Settings>
	<PARAMETER Name="Settings1" Value=" 999 " />       
	<PARAMETER Name="Settings2" Value=" 0 " />        
	<PARAMETER Name="Settings3" Value=" 1 " />       
	<PARAMETER Name="Settings4" Value=" 21000 " />       
	....
<Settings>

und möchte ihn deserialisieren in dieser Klasse


public class Configuration
{
   public uint Settings1{ get; internal set; }    
   public ushort Settings2{ get; internal set; }
}

Deserialisieren habe ich so gemacht weil ich keinen direkten Weg gefunden habe:


public class Parameter
    {
        [XmlAttribute("Name")]
        public string Name { get; set; }

        [XmlAttribute("Value")]
        public string Value { get; set; }

    }

 [XmlRoot("Settings")]
    public class Settings
    {
        [XmlElement("PARAMETER")]
        public List<Parameter> Parameters { get; set; }

        public void Read(string filename)
        { 
            var mySerializer = new XmlSerializer(typeof(Settings));
            var myFileStream = new FileStream(filename, FileMode.Open);
            var settings = (Settings)mySerializer.Deserialize(myFileStream);
            Parameters = settings.Parameters;
        }
    }

und dann im zweiten Schritt versucht aus der Parameter list das Config Objekt zu füllen


Configuration configuration = new Configuration();
Settings settings = new Settings();
settings.Read(filename);
Type type = configuration.GetType();
PropertyInfo[] props = type.GetProperties();

foreach (var prop in props)
{
      prop.SetValue(configuration , settings.Parameters.Find(item => item.Name == prop.Name).Value);
} 

bei set property value bekomme ich eine Exception beim konvertieren von string nach int32 oder short.
wie kann ich dynamisch konvertieren in den Datentyp von jeden Property, oder geht es einfacher das ganze zu realisieren?
diese Settings sind unterschiedlich groß (4 und 2 Bytes) und möchte sie konvertieren in Bytes und über den Serialport senden

2.298 Beiträge seit 2010
vor 3 Jahren

Ist das Xml so vorgegeben oder kannst du das frei ändern?

Ansonsten.. wieso arbeitest du mit Reflection? Ich würde die Parameter einfach in einer Schleife durchgehen und anhand des Parameters den entsprechenden Wert setzen.


Configuration configuration = new Configuration();

foreach(Parameter parameter in settings.Parameters)
{
     switch(parameter.Name)
     {
          case "Settings1":
              configuration.Settings1 = Convert.ToUInt32(parameter.Value);
              break;
         ....
     }
}

Das wäre am Ende die sicherste Variante auf deinem Weg.

Ansonsten wenn man bei deinem Ansatz bleibt:


object oValue = settings.Parameters.Find(item => item.Name == prop.Name).Value;
prop.SetValue(configuration , Convert.ChangeType(oValue, prop.PropertyType));

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 3 Jahren

Danke für die Antwort.

ich kann xml ändern.
du meinst sowas


<Settings>
	<Settings1 Value=" 999 " />
	<Settings2 Value=" 0 " />
	<Settings3 Value=" 1 " />
	<Settings4 Value=" 21000 " />
	....
<Settings>

ich arbeite mit Reflection weil ich 40 Parameters habe und dachte dass es eleganter ist als 40 cases

D
261 Beiträge seit 2015
vor 3 Jahren

Versuchst du Einstellungen deiner Anwendung persistent zu speichern?
Vielleicht ist dann das folgende etwas für dich: Manage application settings (.NET) - Visual Studio

Edit: Oder für .NET Core / 5: ConfigurationManager.AppSettings Eigenschaft (System.Configuration)

2.298 Beiträge seit 2010
vor 3 Jahren

Hallo,

ich kann xml ändern.

was für Informationen beschreiben denn die "Settings"? Das sind doch wenn ich dich richtig verstehe irgendwelche Parameter für eine andere Schnittstelle (du schriebst: "und möchte sie konvertieren in Bytes und über den Serialport senden").

Dann haben die einzelnen Parameter ja sicherlich sprechende Namen.

Ansonsten, da du ja schreibst du kannst die XML frei ändern. Was spricht also dagegen dein Configuration-Objekt direkt zu serialisieren / deserialisieren? Das Xml sehe hier ja auch nur ein klein wenig anders aus:


<?xml version="1.0"?>
<Configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Settings1>10</Settings1>
  <Settings2>0</Settings2>
</Configuration>

Und wenns dann doch "Settings" heißen soll im Root:


[XmlRoot("Settings")]
public class Configuration

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |