2016-11-23 1 views
1

Supposons que nous avons un:sérialiser une liste <KeyValuePair <string, object >>

public List<KeyValuePair<string, object>> Items { get; set; } 

Comment pouvons-nous sérialisation comme suit:

<!--<SomeEnclosingElement>--> 
    <Key1>Value1.ToString()</Key1> 
    <Key2>Value2.ToString()</Key2> 
    ... 
    <KeyN>ValueN.ToString()</KeyN> 
<!--</SomeEnclosingElement>--> 

utilisant XmlSerializer, si possible, sans mesure mise en œuvre de IXmlSerializable?

S'il vous plaît noter deux choses:

  • Les noms des éléments (tag) varie d'un nœud à
  • Aucun élément englobante nécessaire du tout (je l'ai commenté au-dessus juste pour mieux illustrer cette exigence)

Répondre

1

Compte tenu de votre obligation de ne pas mettre en œuvre IXmlSerializable, vous pouvez ajouter une propriété public XElement[] de substitution marqué par [XmlAnyElement] à votre type:

[XmlIgnore] 
    public List<KeyValuePair<string, object>> Items { get; set; } 

    [XmlAnyElement] 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    public XElement[] XmlItems 
    { 
     get 
     { 
      if (Items == null) 
       return null; 
      return Items.Select(p => new XElement(p.Key, (p.Value ?? string.Empty).ToString())).ToArray(); 
     } 
     set 
     { 
      if (value == null) 
       return; 
      Items = Items ?? new List<KeyValuePair<string, object>>(value.Length); 
      foreach (var e in value) 
      { 
       Items.Add(new KeyValuePair<string, object>(e.Name.LocalName, e.Value)); 
      } 
     } 
    } 

La propriété d'origine est marquée avec [XmlIgnore] tandis que la propriété de substitution renvoie un tableau de XElement objets dont les noms sont cartographiés de KeyValuePair.Key et dont les valeurs sont mises en correspondance à partir de KeyValuePair.Value.ToString().

Échantillon fiddle.