2011-06-30 12 views
7

Mam kilka klas kontenerów, które eksponują swoje kolekcje poprzez ReadOnlyCollection. Niestandardowe metody są dostarczane do Dodaj i usuń z kolekcji, która wykonuje również niestandardową logikę.Serializacja Xml ReadOnlyCollections

Na przykład:

public class Foo 
{ 
    List<Bar> _barList = new List<Bar>(); 

    public ReadOnlyCollection<Bar> BarList 
    { 
     get { return _barList.AsReadOnly(); } 
    } 

    public void AddBar(Bar bar) 
    { 
     if (bar.Value > 10) 
      _barList.Add(bar); 
     else 
      MessageBox.Show("Cannot add to Foo. The value of Bar is too high"); 
    } 
    public void RemoveBar(Bar bar) 
    { 
     _barList.Remove(bar); 
     // Foo.DoSomeOtherStuff(); 
    } 

} 

public class Bar 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 
} 

To wszystko dobrze i dobre, ale kiedy wracam do serialise Foo z XML serializer jest wyjątek.

Czy ktoś może zaoferować dobry sposób, aby o tym poradzić?

Dzięki

+0

Co to jest wyjątek? –

+1

Zgłasza wyjątek InvalidOperationException z powodu błędu w odzwierciedleniu Foo. –

Odpowiedz

2

Nie można deserializowania ReadOnlyCollection ponieważ nie ma Add metody. Aby ustalić, które używają drugą właściwość dla serializacji:

[XmlIgnore()] 
public ReadOnlyCollection<Bar> BarList 
{ 
    get { return _barList.AsReadOnly(); } 
} 

[Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
[DebuggerBrowsable(DebuggerBrowsableState.Never)] 
//[Obsolete("This is only for serialization process", true)] 
[XmlArray("BarList")] 
[XmlArrayItem("Bar")] 
public List<Bar> XmlBarList 
{ 
    get { return _barList; } 
    set { _barList = value; } 
} 
+2

Myślę, że właściwości oznaczone jako Przestarzałe, również nie są serializowane ... –

+1

@Frederik: Po prostu daj test i dowiedz się, że masz rację. właściwości 'Obsolete' nie zostaną przekształcone do postaci szeregowej. Dziękuję za komentarz i przepraszam za moją #insistence_, że to robi. –

+0

Cześć, dziękuję za odpowiedź, również znajduję Dodawanie znacznika Przestarzałe zapobiega serializacji –

4

Rzeczywiście, to nie będzie działać. Więc nie rób tego. Dodatkowo, nie ma haków do wykrywania serializacji xml z wyjątkiem oh-tak-bolesne IXmlSerializable.

Więc albo:

  • nie używać tylko do odczytu kolekcja tutaj
  • wdrożyć IXmlSerializable (trudne)
  • posiada podwójny interfejs API (jeden tylko do odczytu, nie; serializacji " nie”- trudne jak XmlSerializer obsługuje tylko publicx członków)
  • użyć osobnego dto dla serializacji