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ść?

Odpowiedzi:


176

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.

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).


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.