2010-11-28 7 views
8

Je cherche à personnaliser la sérialisation d'un attribut. Je pensais que ce serait simple, mais je n'étais pas capable de réaliser ce que je voulais faire comme je le voulais.Comment créer votre série XmlAttribute personnalisée

Voici donc un exemple simple:

Classe Définition:

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

Xml Résultat que je voudrais:

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

Le seul travail autour j'ai fait pour avoir c'était à mettre un attribut [XmlIgnore] et créer une autre propriété avec du code qui a fait la transformation.

Alors, ma question, y a-t-il un meilleur moyen que de créer une nouvelle propriété? Peut-être qu'il existe une sorte de TypeConverter que vous pouvez créer pour que le sérialiseur l'utilise?

En outre, j'ai essayé d'utiliser l'attribut Type mais sans succès. (Toujours obtenir des exceptions). Mais d'après ce que j'ai lu, c'est pour un type de données déjà défini.

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

Une autre façon intéressante serait comme ça:

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

Merci.


Modifier Aucune solution que je cherchais a été présenté, je me suis finalement décidé d'opter pour la solution « IXmlSerializable ».

Répondre

3

Vous pouvez:

  1. Mettre en œuvre IXmlSerializable et gérer tous les sérialisation/désérialisation pour votre type manuellement
  2. Utilisez une propriété de substitution:

    [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

mère porteuse la propriété est exactement ce qu'il essaie d'éviter. – SLaks

+0

Vous avez juste besoin d'ajouter des espaces (comme 4) au début de votre ligne. Assurez-vous également qu'il y a 2 retours chariot. Pour, votre réponse, j'ai dit dans mon message que je voulais éviter votre deuxième possibilité. Pour le premier, je ne voulais pas recourir à cette solution, mais c'est peut-être la seule solution. Je suppose que créer ma "classe de tableau" n'est pas trop mauvais. – Sauleil

+0

@SLaks: mes utilisations appellent ce genre de fonctionnalité "bug" ;-) –