Typy obsługiwane przez serializator kontraktu danych
Program Windows Communication Foundation (WCF) używa jako domyślnego DataContractSerializer aparatu serializacji, aby przekonwertować dane na format XML i przekonwertować kod XML z powrotem na dane. Jest DataContractSerializer przeznaczony do serializacji typów kontraktów danych. Obsługuje jednak wiele innych typów, które mogą być uważane za niejawne kontrakty danych. Poniżej znajduje się pełna lista typów, które można serializować:
Wszystkie publicznie widoczne typy, które mają konstruktor, który nie ma parametrów.
Typy kontraktów danych. Są to typy, do których DataContractAttribute zastosowano atrybut. Nowe typy niestandardowe reprezentujące obiekty biznesowe powinny być zwykle tworzone jako typy kontraktów danych. Aby uzyskać więcej informacji, zobacz Using Data Contracts and Serializable Types (Używanie kontraktów danych i typów możliwych do serializacji).
Typy kolekcji. Są to typy reprezentujące listy danych. Mogą to być regularne tablice typów lub typów kolekcji, takich jak ArrayList i Dictionary<TKey,TValue>. Atrybut CollectionDataContractAttribute może służyć do dostosowywania serializacji tych typów, ale nie jest wymagany. Aby uzyskać więcej informacji, zobacz Typy kolekcji w kontraktach danych.
Typy wyliczenia. Wyliczenia, w tym wyliczenia flag, można serializować. Opcjonalnie typy wyliczenia można oznaczyć atrybutem DataContractAttribute , w takim przypadku każdy element członkowski, który uczestniczy w serializacji, musi być oznaczony atrybutem EnumMemberAttribute . Elementy członkowskie, które nie są oznaczone, nie są serializowane. Aby uzyskać więcej informacji, zobacz Typy wyliczenia w kontraktach danych.
Typy pierwotne programu .NET Framework. Następujące typy wbudowane w program .NET Framework mogą być serializowane i są uważane za typy pierwotne: Byte, Int16UInt32UInt16UInt64Int64SingleDoubleInt32SByteCharDecimalBooleanObjecti .String
Inne typy pierwotne. Te typy nie są typami pierwotnymi w programie .NET Framework, ale są traktowane jako typy pierwotne w postaci serializowanego kodu XML. Te typy to DateTime, , DateTimeOffset, GuidTimeSpanUri, , XmlQualifiedNamei tablice .Byte
Uwaga
W przeciwieństwie do innych typów pierwotnych nie DateTimeOffset jest domyślnie znanym typem. Aby uzyskać więcej informacji, zobacz Znane typy kontraktów danych.
Typy oznaczone atrybutem SerializableAttribute . Wiele typów zawartych w bibliotece klas bazowych programu .NET Framework należy do tej kategorii. W DataContractSerializer pełni obsługuje ten model programowania serializacji, który był używany przez komunikacji zdalną programu .NET Framework, BinaryFormatteri , w SoapFormattertym obsługę interfejsu ISerializable .
Typy reprezentujące nieprzetworzone dane XML lub typy reprezentujące ADO.NET danych relacyjnych. Tablica XmlElement typów i XmlNode jest obsługiwana jako sposób bezpośredniego reprezentowania kodu XML. Ponadto obsługiwane są typy implementujące IXmlSerializable interfejs, w tym powiązany XmlSchemaProviderAttribute atrybut i XDocumentXElement typy. Typ ADO.NETDataTable i DataSet typ (a także jego klasy pochodne) implementują IXmlSerializable interfejs i w związku z tym mieszczą się w tej kategorii. Aby uzyskać więcej informacji, zobacz TYPY XML i ADO.NET w kontraktach danych.
Ograniczenia dotyczące używania niektórych typów w trybie częściowego zaufania
Poniżej przedstawiono listę ograniczeń dotyczących używania niektórych typów w scenariuszach w trybie częściowego zaufania:
Aby serializować lub deserializować typ implementujący ISerializable częściowo zaufany kod przy użyciu parametru DataContractSerializerSerializationFormatter i UnmanagedCode .
W przypadku uruchamiania kodu WCF w trybie częściowego zaufania serializacja i deserializacja
readonly
pól (zarównopublic
iprivate
) nie jest obsługiwana. Jest to spowodowane tym, że wygenerowany il jest niemożliwy do zweryfikowania i dlatego wymaga podwyższonych uprawnień.DataContractSerializer Oba elementy i XmlSerializer są obsługiwane w środowisku częściowego zaufania. Jednak użycie obiektu DataContractSerializer podlega następującym warunkom:
Wszystkie typy możliwe do
[DataContract]
serializacji muszą być publiczne.Wszystkie pola lub właściwości z możliwością serializacji w typie
[DataContract]
muszą być publiczne i odczytywane[DataMember]
/zapisywane. Serializacja i deserializacjireadonly
pól nie jest obsługiwana podczas uruchamiania programu WCF w częściowo zaufanej aplikacji.Model
[Serializable]
/ISerializable]
programowania nie jest obsługiwany w środowisku częściowego zaufania.Znane typy muszą być określone w konfiguracji kodu lub na poziomie komputera (
Machine.config
). Znanych typów nie można określić w konfiguracji na poziomie aplikacji ze względów bezpieczeństwa.
Typy implementujące IObjectReference zgłaszają wyjątek w częściowo zaufanym środowisku, ponieważ GetRealObject metoda wymaga uprawnień zabezpieczeń
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
.
Dodatkowe uwagi dotyczące serializacji
Następujące reguły dotyczą również typów obsługiwanych przez serializator kontraktu danych:
Typy ogólne są w pełni obsługiwane przez serializator kontraktu danych.
Typy wartości dopuszczalnych wartości są w pełni obsługiwane przez serializator kontraktu danych.
Typy interfejsów są traktowane jako Object lub, w przypadku interfejsów kolekcji, jako typy kolekcji.
Obsługiwane są zarówno struktury, jak i klasy.
Program DataContractSerializer nie obsługuje modelu programowania używanego XmlSerializer przez usługi sieci Web i ASP.NET. W szczególności nie obsługuje atrybutów takich jak XmlElementAttribute i XmlAttributeAttribute. Aby włączyć obsługę tego modelu programowania, należy przełączyć program WCF, aby używać XmlSerializer elementu DataContractSerializerzamiast .
Typ DBNull jest traktowany w specjalny sposób. Jest to pojedynczy typ, a po deserializacji deserializator uwzględnia ograniczenie singleton i wskazuje wszystkie
DBNull
odwołania do pojedynczego wystąpienia. PonieważDBNull
jest to typ możliwy do serializacji, wymaga SerializationFormatter uprawnień.