2010-04-28 7 views
11

Ich habe ein Objekt, das ein Objekt enthält, die als IEnumerable definded, dhSerialize Objekte mit xmlSerializer.Serialize und IEnumerable Objekte

[Serializable] 
[XmlRoot("MyObject")] 
public class MyObject 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    [XmlArrayAttribute("Numbers")] 
    public IEnumerable<string> Numbers { get; set; } 
} 

Als ich das XmlSerializer.Serialize gegen das Objekt ausgeführt werden, das heißt

 MyObject myObject = new MyObject() { 
      Name = "My Name" , 
      Numbers= new List<string>(){"One", "Two"} 
     }; 



    var xmlSerializer = XmlSerializer.FromTypes(new[] 
{ typeof(MyObject) })[0]; 
      using (var xmlWriter = XmlWriter.Create(@"MyObject.xml")) 
      { 
       if (xmlWriter != null) xmlSerializer.Serialize(xmlWriter, myObject); 
      } 

ich

„Kann nicht Mitglied SerializeObjects.MyObject.Numbers serialisiert von Typ System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] , weil es ist eine Schnittstelle.“

Ich verstehe, dass Sie eine Schnittstelle nicht serialisieren können.

Nun zur Frage:

Was ist die beste Erklärung für die ist "public IEnumerable Zahlen {get; set;}"?

Sollte ich List<> verwenden, wenn nicht warum nicht?

Antwort

8

verwenden. Allgemein sollten Sie Collection<T> verwenden, wenn Sie Benutzer Ihrer Klasse frei sein möchten, um es zu ändern, oder ReadOnlyCollection<T>, wenn Sie dies nicht tun. Es wird nicht empfohlen, List<T> in öffentlichen Schnittstellen zu verwenden (source).

Da diese Klasse jedoch für die XML-Serialisierung verwendet wird und daher vermutlich nicht für andere Zwecke als die Darstellung von XML als Objektmodell verwendet wird, gelten die Regeln nicht wirklich wie eine "normale" API Es wird keine anderen Verbraucher als die XmlSerializer haben, und so ist es nicht wirklich wichtig, was Sie verwenden. Ich würde mich wahrscheinlich immer noch an die Empfehlungen halten.

1

Wenn es Ihnen nichts ausmacht, die Liste editierbar zu sein, d. H. Das Hinzufügen/Entfernen öffentlich dann List<> wäre in Ordnung. Andernfalls sollten Sie ReadOnlyCollection