System.Runtime.Serialization.DataContractSerializer, klasa
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
DataContractSerializer Użyj klasy , aby serializować i deserializować wystąpienia typu w strumieniu XML lub dokumencie. Można na przykład utworzyć typ o nazwie Person
z właściwościami zawierającymi podstawowe dane, takie jak nazwa i adres. Następnie można utworzyć wystąpienie Person
klasy i manipulować nim i zapisać wszystkie jej wartości właściwości w dokumencie XML na potrzeby późniejszego pobierania lub w strumieniu XML w celu natychmiastowego transportu. Co najważniejsze, DataContractSerializer element służy do serializacji i deserializacji danych wysyłanych w komunikatach programu Windows Communication Foundation (WCF). DataContractAttribute Zastosuj atrybut do klas i DataMemberAttribute atrybut do składowych klasy, aby określić właściwości i pola, które są serializowane.
Aby uzyskać listę typów, które można serializować, zobacz Typy obsługiwane przez serializator kontraktu danych.
Aby użyć DataContractSerializerklasy , najpierw utwórz wystąpienie klasy i obiekt odpowiedni do zapisywania lub odczytywania formatu, na przykład wystąpienia XmlDictionaryWriterklasy . Następnie wywołaj metodę , WriteObject aby utrwała dane. Aby pobrać dane, utwórz obiekt odpowiedni do odczytania formatu danych (na przykład XmlDictionaryReader dla dokumentu XML) i wywołaj metodę ReadObject .
Aby uzyskać więcej informacji na temat korzystania z programu DataContractSerializer, zobacz Serializacja i Deserializacja.
Typ serializatora kontraktu danych można ustawić przy użyciu <elementu dataContractSerializer> w pliku konfiguracji aplikacji klienckiej.
Przygotowywanie klas do serializacji lub deserializacji
Element DataContractSerializer jest używany w połączeniu DataContractAttribute z klasami i DataMemberAttribute . Aby przygotować klasę do serializacji, zastosuj klasę DataContractAttribute do klasy . Dla każdego elementu członkowskiego klasy zwracającej dane, które chcesz serializować, zastosuj element DataMemberAttribute. Pola i właściwości można serializować niezależnie od ułatwień dostępu: prywatny, chroniony, wewnętrzny, chroniony wewnętrzny lub publiczny.
Na przykład schemat określa Customer
właściwość z właściwością ID
, ale masz już istniejącą aplikację, która używa typu o nazwie Person
z właściwością Name
. Aby utworzyć typ zgodny z kontraktem, najpierw zastosuj element DataContractAttribute do klasy . Następnie zastosuj element DataMemberAttribute do każdego pola lub właściwości, które chcesz serializować.
Uwaga
Element można zastosować DataMemberAttribute zarówno do członków prywatnych, jak i publicznych.
Ostateczny format xml nie musi być tekstem. DataContractSerializer Zamiast tego zapisuje dane jako zestaw informacji XML, który umożliwia zapisanie danych w dowolnym formacie rozpoznanym przez element XmlReader i XmlWriter. Zaleca się używanie XmlDictionaryReader klas i XmlDictionaryWriter do odczytu i zapisu, ponieważ obie są zoptymalizowane pod kątem pracy z elementem DataContractSerializer.
Jeśli tworzysz klasę zawierającą pola lub właściwości, które muszą zostać wypełnione przed wykonaniem serializacji lub deserializacji, użyj atrybutów wywołania zwrotnego zgodnie z opisem w temacie Wywołania zwrotne serializacyjne odporne na wersje.
Dodaj do kolekcji znanych typów
Podczas serializacji lub deserializacji obiektu wymagane jest, aby typ był "znany" dla obiektu DataContractSerializer. Zacznij od utworzenia wystąpienia klasy, która implementuje IEnumerable<T> (np List<T>. ) i dodaje znane typy do kolekcji. Następnie utwórz wystąpienie DataContractSerializer przy użyciu jednego z przeciążeń, które przyjmuje IEnumerable<T> wartość (na przykład DataContractSerializer(Type, IEnumerable<Type>)).
Uwaga
W przeciwieństwie do innych typów DateTimeOffset pierwotnych struktura nie jest domyślnie znanym typem, dlatego należy ją ręcznie dodać do listy znanych typów (zobacz Znane typy kontraktów danych).
Zgodność z przekazywaniem
Rozumie DataContractSerializer kontrakty danych, które zostały zaprojektowane tak, aby były zgodne z przyszłymi wersjami kontraktu. Takie typy implementują IExtensibleDataObject interfejs. Interfejs zawiera ExtensionData właściwość zwracającą ExtensionDataObject obiekt. Aby uzyskać więcej informacji, zobacz Kontrakty danych zgodne z przekazywaniem.
Uruchamianie w ramach częściowego zaufania
Podczas tworzenia wystąpienia obiektu docelowego podczas deserializacji DataContractSerializer obiekt nie wywołuje konstruktora obiektu docelowego. Jeśli tworzysz typ [DataContract], który jest dostępny z częściowego zaufania (tj. jest publiczny i w zestawie, który ma AllowPartiallyTrustedCallers
zastosowany atrybut) i wykonuje niektóre akcje związane z zabezpieczeniami, należy pamiętać, że konstruktor nie jest wywoływany. W szczególności następujące techniki nie działają:
- Jeśli spróbujesz ograniczyć dostęp do częściowego zaufania przez utworzenie konstruktora wewnętrznego lub prywatnego albo dodanie elementu
LinkDemand
do konstruktora — żaden z nich nie ma żadnego wpływu podczas deserializacji w ramach częściowego zaufania. - Jeśli kodujesz klasę, która zakłada, że konstruktor został uruchomiony, klasa może dostać się do nieprawidłowego stanu wewnętrznego, który można wykorzystać.