2009-07-22 1 views
1

Ich habe diesen XML-Schnipsel als Teil einer XML-Datei, die eine C# Objekt deserialisiert wirdProblem Serialisierung eine Klasse eine Sammlung mit unter Verwendung von XML-Serialisierung

<EmailConfiguration> 
<SendTo> 
    <Address>[email protected]</Address> 
    <Address>also send to</Address> 
</SendTo> 
<CC> 
    <Address>CC</Address> 
</CC> 
<BCC> 
    <Address>BCC</Address> 
</BCC> 
</EmailConfiguration> 

Beachten Sie die SendToAddress ist eine Sammlung von Adressen

<Address>[email protected]</Address> 
<Address>also send to</Address> 

meine Klasse sieht derzeit wie folgt aus

public class SendTo 
{ 
    public string Address 
    { 
     get; 
     set; 
    } 
} 

Das ist gut für 1 Adresse, wie ändere ich die Klasse, so dass es mehr als 1 Adresse behandeln kann.

Ich versuchte

public class SendTo 
{ 
    public string[] Address 
    { 
     get; 
     set; 
    } 
} 

Aber mit diesem, wird nichts aufgefüllt, wenn die xml zu einer Klasse deserialisiert wird.

aktualisieren

versucht ... auch ohne Erfolg ....

public class SendTo 
{ 
    public List<string> Address 
    { 
     get; 
     set; 
    } 
} 

Hier ist die ganze Klasse

namespace myConfiguration 
    { 
public class myConfiguration 
{ 
    private string myID; 


    public string MyID 
    { 
     get { return myID; } 
     set { myID = value; } 
    } 

    public Locale Locale 
    { 
     get; 
     set; 
    } 

    public EmailConfiguration EmailConfiguration 
    { 
     get; 
     set; 
    } 

} 

public class Locale 
{ 
    public string LocaleName 
    { 
     get; 
     set; 
    } 
    public string LocaleCode 
    { 
     get; 
     set; 
    } 
} 

public class EmailConfiguration 
{ 
    public SendTo SendTo 
    { 
     set; 
     get; 
    } 
    public SendTo CC 
    { 
     set; 
     get; 
    } 
    public SendTo BCC 
    { 
     set; 
     get; 
    } 
} 

public class SendTo 
{ 
    public List<string> Address 
    { 
     get; 
     set; 
    } 
} 

}

Hier ist der XML dass ich deserialisiere von ...

<?xml version="1.0" encoding="utf-8" ?> 
<MyConfiguration> 
<MyID>vpfaewb</MyID> 
<Locale> 
    <LocaleName>cs-CZ</LocaleName> 
<LocaleCode>1029</LocaleCode> 
</Locale> 
<EmailConfiguration> 
<SendTo> 
    <Address>my email address</Address> 
    <Address>also send to</Address> 
</SendTo> 
<CC> 
    <Address>CC</Address> 
</CC> 
<BCC> 
    <Address>BCC</Address> 
</BCC> 
    </EmailConfiguration> 
</MyConfiguration> 
+1

Wie machen Sie Ihre Serialisierung und Deserialisierung? –

Antwort

1

Versuchen Sie folgendes:

[XmlArrayItem("Address", IsNullable=false)] 
public string[] SendTo 
{ 
    get 
    { 
     return this.sendToField; 
    } 
    set 
    { 
     this.sendToField = value; 
    } 
} 
+0

Du bist fertig! Danke Danny :) Das funktioniert, kannst du bitte erklären, warum das funktioniert? –

+0

von http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrarayitemattribute.aspx: Das XmlArrayItemAttribute gehört zu einer Familie von Attributen, die steuert, wie der XmlSerializer ein Objekt serialisiert oder deserialisiert. Sie können das XmlArrayItemAttribute auf jedes öffentliche Lese-/Schreibelement anwenden, das ein Array zurückgibt oder Zugriff auf eins bereitstellt. Beispielsweise ein Feld, das ein Array von Objekten, eine Auflistung, eine ArrayList oder eine beliebige Klasse zurückgibt, die die IEnumerable-Schnittstelle implementiert. –

+0

Sehr nützlich zu wissen !!! Danke nochmal Mate –

0

Verwenden Sie eine Liste <Adresse> Sammlung; es ist serializabe

+0

Frage aktualisiert .... –

+0

Arrays sind auch serialisierbar. –

+0

Ich entschied mich für die Liste zu gehen, danke für den Tipp.Es sieht einfach sauberer aus als ein Array, und ich bin mir sicher, dass es einfacher auf dem Speicher ist. –

0

Vielleicht nicht die beste Art zu verwenden, aber eine ArrayList ist auch serialisierbar und einen Versuch wert.

1

Wenn Sie Ihren Test XML-Datei durch das xsd.exe Tool von Microsoft zweimal ausführen, zuerst die XML in einen XSD Drehen (xsd.exe yourfile.xml -> yourfile.xsd) und dann von diesem XSD eine C# Klasse zu erzeugen (xsd.exe /c yourfile.xsd -> yourfile.cs), die diese XML-Inhalte deserialisieren können Sie mit etwas so enden werden (lang und nicht sehr schön .....)

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:2.0.50727.4016 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

using System.Xml.Serialization; 

// 
// This source code was auto-generated by xsd, Version=2.0.50727.3038. 
// 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class EmailConfiguration { 

    private object[] itemsField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("BCC", typeof(EmailConfigurationBCC), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("CC", typeof(EmailConfigurationCC), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("SendTo", typeof(EmailConfigurationSendTo), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public object[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class EmailConfigurationBCC { 

    private string addressField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string Address { 
     get { 
      return this.addressField; 
     } 
     set { 
      this.addressField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class EmailConfigurationCC { 

    private string addressField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public string Address { 
     get { 
      return this.addressField; 
     } 
     set { 
      this.addressField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class EmailConfigurationSendTo { 

    private EmailConfigurationSendToAddress[] addressField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("Address", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
    public EmailConfigurationSendToAddress[] Address { 
     get { 
      return this.addressField; 
     } 
     set { 
      this.addressField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class EmailConfigurationSendToAddress { 

    private string valueField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlTextAttribute()] 
    public string Value { 
     get { 
      return this.valueField; 
     } 
     set { 
      this.valueField = value; 
     } 
    } 
} 

ich würde denken, das wird funktionieren - es ist nicht nett, aber es wird funktionieren. Sie sollten Ihre vollständige XML-Datei auf diese Weise in eine serialisierbare/deserialisierbare C# -Klasse konvertieren können. Versuch es!

Marc

+0

Danke Marc für deine Antwort, ich möchte nicht das XSD-Tool knacken, aber ich habe diesen Weg zuerst gemacht und das Objekt nicht erstellt richtig, auch nachdem ich das XSD manuell gehackt habe, entschied ich mich letztendlich dafür, es manuell zu machen. –

+0

kein Problem - manchmal funktioniert es gut, in anderen Fällen nicht so viel .... aber es könnte Ihnen eine Idee geben, welche Attribute und solche Sie vermissen. –

0

Check out Xml Serialization Spitze 2 für Details über eine Liste Sammlung Serialisierung.