Udostępnij za pośrednictwem


klasa System.Runtime.Serialization.DataContractSerializer

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). Zastosuj atrybut DataContractAttribute do klas i atrybut DataMemberAttribute 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ć DataContractSerializer jako klasy, najpierw utwórz wystąpienie klasy i obiekt odpowiedni do zapisywania lub odczytywania formatu, na przykład wystąpienie XmlDictionaryWriter. 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 z klasami DataContractAttribute i DataMemberAttribute. Aby przygotować klasę do serializacji, zastosuj DataContractAttribute do klasy. Dla każdego członka klasy, który zwraca dane, które chcesz serializować, zastosuj DataMemberAttribute. Pola i właściwości można serializować niezależnie od poziomu dostępu: prywatny, chroniony, wewnętrzny, chroniona wewnętrzna lub publiczny.

Na przykład, schemat określa Customer, który ma właściwość ID, ale już posiadasz aplikację używającą 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 / Notatka

Możesz zastosować element 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 klas XmlDictionaryReader i XmlDictionaryWriter do odczytu i zapisu, ponieważ obie są zoptymalizowane pod kątem pracy z 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 zwrotnych, zgodnie z opisem w Version-Tolerant Wywołania Zwrotne Serializacji.

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> (na przykład DataContractSerializer(Type, IEnumerable<Type>)).

Uwaga / Notatka

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ść w przód

DataContractSerializer rozumie 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 Forward-Compatible Kontrakty danych.

Uruchamianie w ramach częściowego zaufania

Podczas tworzenia wystąpienia obiektu docelowego podczas deserializacji, DataContractSerializer nie wywołuje konstruktora obiektu docelowego. Jeśli tworzysz typ [DataContract] dostępny przy użyciu zaufania częściowego (tj. jest publiczny i znajduje się w zestawie, który ma zastosowany atrybut AllowPartiallyTrustedCallers) i wykonuje działania związane z zabezpieczeniami, musisz być świadomy, ż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ć.