Jak mogę zignorować właściwość podczas serializacji przy użyciu DataContractSerializer?

125

Do serializacji klasy używam .NET 3.5SP1 i DataContractSerializer. W dodatku SP1 zmienili zachowanie, aby nie trzeba było dołączać atrybutów DataContract / DataMember do klasy i po prostu serializował całość. To jest zachowanie, którego używam, ale teraz muszę zignorować jedną właściwość serializatora. Wiem, że jednym ze sposobów jest dodanie atrybutu DataContract do klasy i po prostu umieszczenie atrybutu DataMember na wszystkich elementach członkowskich, które chcę dołączyć. Mam jednak powody, że to nie zadziała.

Więc moje pytanie brzmi: czy istnieje atrybut lub coś, czego mogę użyć, aby DataContractSerializer ignorował właściwość?

NotDan
źródło

Odpowiedzi:

176

IgnoreDataMemberAttribute ?

Paul Ruane
źródło
5
Moja warstwa domeny nie miała odpowiedniego odwołania do zestawu, więc nie przeczytałem dokumentacji i pomyślałem, że to nowa funkcja .NET 4.5. Próbowałem znaleźć z powrotem ten wątek, aby usunąć mój komentarz bez powodzenia (spieszyło się). Poza tym, patrząc na datę tej odpowiedzi, powinno było zadzwonić… Post 2009 .NET 4.5… Przepraszamy za marnowanie czasu.
Pluc
2
Na .NET 4.5 tutaj: System.Runtime.Serialization.IgnoreDataMemberAttribute działa na każdą rzecz
SparK,
1
Nawet biblioteki innych firm dodały obsługę [IgnoreDataMember], na przykład JSON.NET.
Doug
5
Czy krótki przykład nie sprawiłby, że ta odpowiedź byłaby rzeczywiście warta głosów?
Data
1
Ta odpowiedź jest niepełna, a zatem wprowadza w błąd. [IgnoreDataMember]nie zadziała, jeśli klasa ma [Serializable]atrybut. Zobacz szczegóły w odpowiedzi Douga .
Alex Fainshtein
165

Ponadto DataContractSerializer będzie serializować elementy oznaczone jako [Serializable], a także serializować nieoznakowane typy w .NET 3.5 SP1 i nowszych, aby umożliwić obsługę serializacji typów anonimowych.

Zależy to więc od tego, jak udekorowałeś swoją klasę, aby powstrzymać członka przed serializacją:

  • Jeśli użyłeś [DataContract], usuń [DataMember]właściwość.
  • Jeśli użyłeś [Serializable], dodaj [NonSerialized]przed polem właściwości.
  • Jeśli nie udekorowałeś swojej klasy, powinieneś dodać [IgnoreDataMember]do nieruchomości.
Doug
źródło
1
co miałeś na myśli mówiąc „udekorowałem swoją klasę” proszę wyjaśnić?
alamin
Jeśli nie użyłeś żadnych atrybutów w swojej klasie, takich jak [DataContract] lub [Serializable], możesz dodać [IgnoreDataMember] do właściwości, której nie chcesz serializować. Zobacz odpowiedź Paula lub checkoutall.com/Blog/Index/201410240204236271/…
Doug
8
To znacznie więcej informacji niż zaakceptowana odpowiedź.
pvgoran
Czy istnieje sposób na zignorowanie tego elementu członkowskiego i kontynuowanie serializacji struktury / klasy danych?
ryanwebjackson
Co powiesz na wykluczenie USŁUGI, gdy użyto [Serializowalny]?
Daniel
32

W przypadku serializacji XML można użyć atrybutu [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute), aby zignorować właściwość podczas serializacji klasy.

Może to być przydatne dla Ciebie (lub po prostu może być przydatne dla każdego, kto znalazł to pytanie, próbując dowiedzieć się, jak zignorować właściwość podczas serializacji w XML, tak jak ja).

Kris Adams
źródło
4
Ah głos negatywny. Pomyślałem, że opublikuję to, ponieważ kiedy szukałem sposobu zignorowania właściwości podczas serializacji klasy, pojawił się ten post. I chciałem to tutaj umieścić, gdyby ktoś znalazł ten post tak samo, jak ja.
Kris Adams
[w meta] Myślę, że głosowali negatywnie, ponieważ powinieneś otworzyć kolejne (bardziej szczegółowe) pytanie dotyczące XMLSerialization i odpowiedzieć na nie, aby ludzie uznali to pytanie za bardziej trafne w ich wyszukiwaniu
SparK
8
Ta odpowiedź jest dokładnie tym, czego szukałem
aclave1