Serializuj obiekty przy użyciu obiektów xmlSerializer.Serialize i IEnumerable

Mam obiekt, który przechowuje obiekt zdefiniowany jako IEnumerable, tj.

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

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

Kiedy uruchamiam XmlSerializer.Serialize względem obiektu, tj.

        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);
            }

dostaję

„Nie można serializować elementu członkowskiego SerializeObjects.MyObject.Numbers typu System.Collections.Generic.IEnumerable`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], ponieważ jest to interfejs.”

Rozumiem, że nie można serializować interfejsu.

A teraz pytanie:

Jaka jest najlepsza deklaracja dla „publicznych liczb IEnumerable { get; set; }”?

Czy powinienem użyć List<>, jeśli nie, to dlaczego?


person Coppermill    schedule 28.04.2010    source źródło


Odpowiedzi (2)


Ogólnie rzecz biorąc, powinieneś użyć Collection<T>, jeśli chcesz, aby użytkownicy Twojej klasy mogli swobodnie ją modyfikować, lub ReadOnlyCollection<T>, jeśli tego nie robisz. Nie zaleca się używania List<T> w interfejsach publicznych (źródło).

Ponieważ jednak ta klasa jest przeznaczona do serializacji XML i prawdopodobnie nie jest używana do żadnego innego celu niż reprezentowanie XML jako modelu obiektowego, reguły nie mają tak naprawdę zastosowania w taki sam sposób, jak „normalny” interfejs API, ponieważ nie będzie on miał żadnego konsumentów innych niż XmlSerializer, zatem nie ma większego znaczenia, czego używasz. Prawdopodobnie jednak nadal będę trzymał się zaleceń.

person Greg Beech    schedule 28.04.2010

Jeśli nie przeszkadza Ci możliwość edycji listy, tj. publiczne dodawanie/usuwanie, wówczas List<> będzie w porządku. W przeciwnym razie powinieneś użyć ReadOnlyCollection

person James    schedule 28.04.2010