2016-09-02 5 views
0

Ich habe folgende xml:Probleme mit Deserialisieren xml Objektstruktur C#

<Root> 
<ProcessingUnit>Lifestyle</ProcessingUnit> 
<ProcessingData> 
    <ProcessType>Product</ProcessType> 
    <ProcessAction>Create</ProcessAction> 
    <Id>7</Id> 
</ProcessingData> 
</Root> 

und ich habe die folgende Objektstruktur

[XmlRoot("Root")] 
public class XmlRoot 
{ 
    ProcessingUnit ProcessingUnit { get; set; } 
    [XmlElement("ProcessingData")] 
    ProcessingData ProcessingData { get; set; } 
} 

public class ProcessingData 
{ 
    public ProcessType ProcessType { get; set; } 
    public ProcessAction ProcessAction { get; set; } 
    public int Id { get; set; } 
} 

Wenn ich deserialisieren i wie folgt vor:

XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot)); 
using (var reader = new StringReader(stringtest)) 
{ 
    var tradeData = (XmlRoot)_serializer.Deserialize(reader); 
} 

Deserialisierung zu Enums funktioniert einwandfrei, die processingUnit wird korrekt deserialisiert, aber die Eigenschaft ProcessingData ist null.

Ich habe versucht, mit vielen verschiedenen XML-Attribute zu dekorieren, aber ich kann nicht sehen, warum ich den Nullwert bekomme.

EDIT: Die stringtest Variable hat den Wert:

var stringtest = 
      "<Root><ProcessingUnit>Lifestyle</ProcessingUnit><ProcessingData><ProcessType>Product</ProcessType><ProcessAction>Create</ProcessAction><Id>7</Id></ProcessingData></Root>"; 

Die Aufzählungen wie folgt aussieht:

public enum ProcessType 
{ 
    [XmlEnum(Name = "Product")] 
    Product, 

    [XmlEnum(Name = "Category")] 
    Category, 
} 

public enum ProcessAction 
{ 
    [XmlEnum(Name = "Create")] 
    Create, 

    [XmlEnum(Name = "Delete")] 
    Delete, 

    [XmlEnum(Name = "Update")] 
    Update, 
} 

public enum ProcessingUnit 
{ 
    [XmlEnum(Name = "LifeStyle")] 
    LifeStyle 
} 
+0

Sind Sie sicher, Dein 'stringtest' enthält das eigentliche xml? Ich kann keine Fehler in dem von Ihnen bereitgestellten Code sehen. – HimBromBeere

+0

Die Serialisierung benötigt parameterlose Konstruktoren für die Objekte, die serialisiert/deserialisiert werden. Sind Sie sicher, dass ProcessingAction und ProcessingType diese bereitstellen? – Jonas

+0

Thansk für die Antwort, Siehe Bearbeiten :) – Diemauerdk

Antwort

0

Eigenschaften öffentlich sein müssen

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string stringtest = "<Root>" + 
       "<ProcessingUnit>Lifestyle</ProcessingUnit>" + 
       "<ProcessingData>" + 
        "<ProcessType>Product</ProcessType>" + 
        "<ProcessAction>Create</ProcessAction>" + 
        "<Id>7</Id>" + 
       "</ProcessingData>" + 
       "</Root>"; 

      XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot)); 
      using (var reader = new StringReader(stringtest)) 
      { 
       XmlRoot tradeData = (XmlRoot)_serializer.Deserialize(reader); 
      } 


     } 
    } 
    [XmlRoot("Root")] 
    public class XmlRoot 
    { 
     [XmlElement("ProcessingUnit")] 
     public ProcessingUnit ProcessingUnit { get; set; } 
     [XmlElement("ProcessingData")] 
     public ProcessingData ProcessingData { get; set; } 
    } 
    [XmlRoot("ProcessingData")] 
    public class ProcessingData 
    { 
     [XmlElement("ProcessType")] 
     public ProcessType ProcessType { get; set; } 
     [XmlElement("ProcessAction")] 
     public ProcessAction ProcessAction { get; set; } 
     [XmlElement("Id")] 
     public int Id { get; set; } 
    } 
    [XmlRoot("ProcessingUnit")] 
    public class ProcessingUnit 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
    [XmlRoot("ProcessType")] 
    public class ProcessType 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
    [XmlRoot("ProcessAction")] 
    public class ProcessAction 
    { 
     [XmlText] 
     public string text { get; set; } 
    } 
} 
+0

Danke für die Antwort. Ich habe Ihr Beispiel versucht und es funktioniert - aber es funktioniert nicht, wenn ich die enums anstelle von Strings verwenden, dann bekomme ich den Fehler "Es gibt einen Fehler in XML-Dokument (1, 50)" – Diemauerdk

+0

enums sind ganze Zahlen, keine Zeichenfolgen. – jdweng

+0

@jdweng Das stimmt im Speicher, aber nicht mit dem XML-Serializer. Standardmäßig verwendet der 'XmlSerializer' tatsächlich die String-Namen für Enums und nicht die Integer-Werte. –

Verwandte Themen