Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga / Notatka
Ta treść jest przedrukowana za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2. wydanie. Wydanie to zostało opublikowane w 2008 roku, a książka została w pełni zmieniona w trzecim wydaniu. Niektóre informacje na tej stronie mogą być nieaktualne.
Serializacja to proces konwertowania obiektu na format, który można łatwo utrwalić lub transportować. Na przykład można serializować obiekt, transportować go przez Internet przy użyciu protokołu HTTP i deserializować go na maszynie docelowej.
Program .NET Framework oferuje trzy główne technologie serializacji zoptymalizowane pod kątem różnych scenariuszy serializacji. W poniższej tabeli wymieniono te technologie i główne typy platform związane z tymi technologiami.
| Nazwa technologii | Typy główne | Scenariusze |
|---|---|---|
| Serializacja kontraktu danych | DataContractAttribute DataMemberAttribute DataContractSerializer NetDataContractSerializer DataContractJsonSerializer ISerializable |
Ogólna trwałość Usługi sieci Web JSON (JavaScript Object Notation) |
| Serializacja XML | XmlSerializer | Format XML z pełną kontrolą nad kształtem kodu XML |
| Serializacja środowiska uruchomieniowego (dane binarne i SOAP) | SerializableAttribute ISerializable BinaryFormatter SoapFormatter |
Komunikacja zdalna .NET Remoting |
✔️ Pomyśl o serializacji podczas projektowania nowych typów.
Wybór odpowiedniej technologii serializacji do obsługi
✔️ ROZWAŻ obsługę serializacji kontraktu danych, jeśli instancje twojego typu mogą być utrwalane lub używane w usługach sieciowych.
✔️ ROZWAŻ obsługę serializacji XML zamiast lub oprócz serializacji kontraktu danych, jeśli potrzebujesz większej kontroli nad formatem XML generowanym podczas serializacji typu.
Może to być konieczne w niektórych scenariuszach współdziałania, w których należy użyć konstrukcji XML, która nie jest obsługiwana przez serializacji kontraktu danych, na przykład w celu utworzenia atrybutów XML.
✔️ ROZWAŻ obsługę serializacji środowiska uruchomieniowego, jeśli wystąpienia typu muszą przechodzić przez granice komunikacji wirtualnej platformy .NET.
❌ UNIKAJ obsługi serializacji środowiska uruchomieniowego lub serializacji XML tylko ze względów ogólnej trwałości. Preferuj serializację kontraktu danych.
Obsługa serializacji kontraktu danych
Typy mogą obsługiwać serializację kontraktu danych, stosując DataContractAttribute na typ i DataMemberAttribute na członków (pola i właściwości) typu.
✔️ ROZWAŻ oznaczenie elementów danych typu jako publiczne, jeśli typ może być używany w warunkach częściowego zaufania.
W pełnym zaufaniu serializatory kontraktów danych mogą serializować i deserializować niepubliczne typy i składowe, ale tylko publiczne elementy członkowskie mogą być serializowane i deserializowane w częściowym zaufaniu.
✔️ DO zaimplementuj getter i setter we wszystkich właściwościach, które mają DataMemberAttribute. Serializatory kontraktu danych wymagają zarówno metody getter, jak i setter dla typu, który ma być uznawany za serializowalny. (W .NET Framework 3.5 SP1 niektóre właściwości kolekcji mogą być tylko do odczytu). Jeśli typ nie będzie używany w środowisku z ograniczonym zaufaniem, jeden lub oba akcesory właściwości mogą być niepubliczne.
✔️ ROZWAŻ użycie wywołań zwrotnych serializacji w celu zainicjowania zdeserializowanych wystąpień.
Konstruktory nie są wywoływane, gdy obiekty są deserializowane. (Istnieją wyjątki od reguły. Konstruktory kolekcji oznaczonych za pomocą CollectionDataContractAttribute są wywoływane podczas deserializacji). W związku z tym każda logika wykonywana podczas normalnej konstrukcji musi zostać zaimplementowana jako jedna z wywołań zwrotnych serializacji.
OnDeserializedAttribute jest najczęściej używanym atrybutem wywołania zwrotnego. Inne atrybuty w rodzinie to OnDeserializingAttribute, OnSerializingAttributei OnSerializedAttribute. Mogą służyć do oznaczania wywołań zwrotnych, które są wykonywane odpowiednio przed deserializacją, przed serializacją, a na koniec po serializacją.
✔️ ROZWAŻ użycie elementu , KnownTypeAttribute aby wskazać konkretne typy, które powinny być używane podczas deserializacji złożonego grafu obiektów.
✔️ Należy rozważyć zgodność wsteczną i przyszłą podczas tworzenia lub zmieniania typów serializowalnych.
Należy pamiętać, że serializowane strumienie przyszłych wersji typu mogą być deserializowane do bieżącej wersji typu i odwrotnie.
Upewnij się, że rozumiesz, że składowe danych, nawet prywatne i wewnętrzne, nie mogą zmieniać swoich nazw, typów, a nawet kolejności w przyszłych wersjach typu, chyba że podejmiesz szczególne kroki, aby zachować kontrakt przy użyciu jawnych parametrów atrybutów kontraktu danych.
Testowanie zgodności serializacji podczas wprowadzania zmian w typach możliwych do serializacji. Spróbuj zdeserializować nową wersję w starą wersję i na odwrót.
✔️ ROZWAŻ zaimplementowanie IExtensibleDataObject, aby umożliwić dwukierunkową konwersję między różnymi wersjami typu.
Interfejs umożliwia serializatorowi zapewnienie, że żadne dane nie zostaną utracone podczas zaokrąglania. Właściwość IExtensibleDataObject.ExtensionData jest używana do przechowywania dowolnych danych z przyszłej wersji typu, które są nieznane bieżącej wersji, w związku z czym nie może ich przechowywać w swoich elementach członkowskich danych. Gdy bieżąca wersja zostanie następnie serializowana i zdeserializowana w przyszłej wersji, dodatkowe dane będą dostępne w strumieniu serializowanym.
Obsługa serializacji XML
Serializacja kontraktów danych jest główną (domyślną) technologią serializacji w środowisku .NET Framework, ale są scenariusze, których serializacja kontraktów danych nie obsługuje. Na przykład nie daje pełnej kontroli nad kształtem kodu XML produkowanego lub używanego przez serializatora. Jeśli wymagana jest taka precyzyjna kontrola, należy użyć serializacji XML i należy zaprojektować typy, aby obsługiwać tę technologię serializacji.
❌ UNIKAJ projektowania typów specjalnie na potrzeby serializacji XML, chyba że masz bardzo silny powód do kontrolowania kształtu wygenerowanego kodu XML. Ta technologia serializacji została zastąpiona przez serializację kontraktu danych omówionej w poprzedniej sekcji.
✔️ ROZWAŻ zaimplementowanie interfejsu IXmlSerializable , jeśli chcesz mieć jeszcze większą kontrolę nad kształtem serializowanego kodu XML niż oferowane przez zastosowanie atrybutów serializacji XML. Dwie metody interfejsu ReadXml i WriteXml, umożliwiają pełną kontrolę nad serializowanym strumieniem XML. Możesz również kontrolować schemat XML, który jest generowany dla typu, stosując XmlSchemaProviderAttributeelement .
Obsługa serializacji środowiska uruchomieniowego
Serializacja środowiska uruchomieniowego to technologia używana przez .NET Remoting. Jeśli uważasz, że typy będą transportowane przy użyciu komunikacji wirtualnej platformy .NET, musisz upewnić się, że obsługują serializację środowiska uruchomieniowego.
Podstawowa obsługa serializacji środowiska uruchomieniowego może być zapewniona poprzez zastosowanie SerializableAttribute, a bardziej zaawansowane scenariusze obejmują zaimplementowanie prostego wzorca serializowalnego środowiska uruchomieniowego (implementowanie ISerializable i dostarczanie konstruktora serializacji).
✔️ ROZWAŻ obsługę serializacji w czasie wykonywania, jeśli typy będą używane ze zdalną komunikacją .NET. Na przykład przestrzeń nazw System.AddIn używa .NET Remoting, a więc wszystkie typy wymieniane między dodatkami System.AddIn muszą obsługiwać serializację środowiska uruchomieniowego.
✔️ ROZWAŻ zaimplementowanie wzorca umożliwiającego serializację w czasie wykonywania, jeśli chcesz mieć pełną kontrolę nad procesem serializacji. Jeśli na przykład chcesz przekształcić dane w miarę serializacji lub deserializacji.
Wzorzec jest bardzo prosty. Wszystko, co musisz zrobić, to zaimplementować ISerializable interfejs i udostępnić specjalny konstruktor, który jest używany podczas deserializacji obiektu.
✔️ WYKONAJ ochronę konstruktora serializacji i podaj dwa parametry wpisane i nazwane dokładnie tak, jak pokazano w przykładzie tutaj.
[Serializable]
public class Person : ISerializable
{
protected Person(SerializationInfo info, StreamingContext context)
{
// ...
}
}
✔️ Zaimplementuj jawnie elementy ISerializable.
✔️ NALEŻY zastosować żądanie linku do ISerializable.GetObjectData implementacji. Gwarantuje to, że tylko w pełni zaufany rdzeń systemu i Serializator Środowiska Uruchomieniowego mają dostęp do elementu.
© Części 2005, 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.
Przedrukowane za zgodą Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition przez Krzysztofa Cwalinę i Brada Abramsa, opublikowane 22 października 2008 przez Addison-Wesley Professional w ramach serii Microsoft Windows Development.