2010-11-28 17 views
8

Ich bin auf der Suche nach der Serialisierung eines Attributs anpassen. Ich dachte, es wäre einfach, aber ich konnte nicht erreichen, was ich wollte, wie ich es wollte.So erstellen Sie Ihre benutzerdefinierte XmlAttribute Serialisierung

So, hier ist ein einfaches Beispiel:

Klasse Definition:

Class MyClass 
{ 
    [XmlAttribute("myAttribute")] 
    public int[] MyProperty { get; set; } 
} 

Xml Ergebnis, dass ich möchte:

<MyClass myAttribute="1 2 3... N" /> 

Die einzige Arbeit, um tat ich das haben sollte Fügen Sie ein [XmlIgnore] -Attribut hinzu und erstellen Sie eine andere Eigenschaft mit Code, der die Umwandlung durchgeführt hat.

Also, meine Frage, gibt es einen besseren Weg als eine neue Eigenschaft zu erstellen? Vielleicht gibt es eine Art von TypeConverter, den Sie erstellen können, damit der Serializer sie verwenden kann?

Auch habe ich versucht, das Type-Attribut zu verwenden, aber ohne Erfolg. (Immer Ausnahmen erhalten). Aber von dem, was ich gelesen habe, ist es für bereits definierten Datentyp.

[XmlAttribute("myAttribute", typeof(MyConverter))] 
public int[] MyProperty { get; set; } 

Eine weitere interessante Art und Weise, wie das sein würde:

[XmlAttribute("myAttribute")] 
[XmlConverter(typeof(MyConverter))] 
public int[] MyProperty { get; set; } 

Dank.


bearbeiten Da keine Lösung wie ich suchte vorgestellt wurde, entschied ich mich schließlich für die „IXmlSerializable“ Lösung zu entscheiden.

Antwort

3

Sie können entweder:

  1. Implementieren IXmlSerializable und alle manuell für Ihre Art Serialisierung/Deserialisierung Griff
  2. Verwenden Sie ein Surrogat Eigenschaft:

    [XmlIgnore] 
    public int[] MyProperty { get; set; } 
    
    
    [XmlAttribute("myAttribute")] 
    public string _MyProperty 
    { 
        get 
        { 
         return string.Join(" ", MyProperty.Select(x => x.ToString()).ToArray()); 
        } 
        set 
        { 
         MyProperty = value.Split(' ').Select(x => int.Parse(x)).ToArray(); 
        } 
    } 
    
+0

Ihre Leihmutter Eigentum ist genau das, was er zu vermeiden versucht. – SLaks

+0

Sie müssen nur Leerzeichen (wie 4) am Anfang Ihrer Zeile hinzufügen. Stellen Sie außerdem sicher, dass es 2 Wagenrücklauf gibt. Für deine Antwort habe ich in meinem Beitrag gesagt, ich wollte deine zweite Möglichkeit vermeiden. Für den ersten wollte ich nicht auf diese Lösung zurückgreifen, aber vielleicht ist es die einzige Lösung. Ich denke, meine "Array-Klasse" ist nicht schlecht. – Sauleil

+0

@SLaks: meine Anwendungen nennen diese Art von Feature "Bug" ;-) –

Verwandte Themen