Tipos suportados pelo Data Contract Serializer
O Windows Communication Foundation (WCF) usa o DataContractSerializer mecanismo de serialização padrão para converter dados em XML e converter XML novamente em dados. O DataContractSerializer foi projetado para serializar tipos de contrato de dados. No entanto, ele suporta muitos outros tipos, que podem ser pensados como tendo um contrato de dados implícito. A seguir está uma lista completa de tipos que podem ser serializados:
Todos os tipos publicamente visíveis que têm um construtor que não tem parâmetros.
Tipos de contrato de dados. Estes são tipos aos quais o DataContractAttribute atributo foi aplicado. Novos tipos personalizados que representam objetos de negócios normalmente devem ser criados como tipos de contrato de dados. Para obter mais informações, consulte Usando contratos de dados e tipos serializáveis.
Tipos de coleção. Estes são tipos que representam listas de dados. Estes podem ser matrizes regulares de tipos, ou tipos de coleção, como ArrayList e Dictionary<TKey,TValue>. O CollectionDataContractAttribute atributo pode ser usado para personalizar a serialização desses tipos, mas não é necessário. Para obter mais informações, consulte Tipos de coleta em contratos de dados.
Tipos de enumeração. Enumerações, incluindo enumerações de sinalizador, são serializáveis. Opcionalmente, os tipos de enumeração podem ser marcados com o DataContractAttribute atributo, caso em que cada membro que participa da serialização deve ser marcado com o EnumMemberAttribute atributo. Os membros que não estão marcados não são serializados. Para obter mais informações, consulte Tipos de enumeração em contratos de dados.
Tipos primitivos do .NET Framework. Os seguintes tipos incorporados no .NET Framework podem ser serializados e são considerados tipos primitivos: Byte, SByte, Int16, Int32, Int64, UInt16, SingleDoubleUInt64UInt32CharDecimalBooleanObjecte .String
Outros tipos primitivos. Esses tipos não são primitivos no .NET Framework, mas são tratados como primitivos no formato XML serializado. Esses tipos são DateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedName, e matrizes de Byte.
Nota
Ao contrário de outros tipos primitivos, DateTimeOffset não é um tipo conhecido por padrão. Para obter mais informações, consulte Tipos conhecidos de contrato de dados).
Tipos marcados com o SerializableAttribute atributo. Muitos tipos incluídos na biblioteca de classes base do .NET Framework se enquadram nessa categoria. O DataContractSerializer suporta totalmente este modelo de programação de serialização que foi usado pela comunicação remota do .NET Framework, o BinaryFormatter, e o SoapFormatter, incluindo suporte para a ISerializable interface.
Tipos que representam XML bruto ou tipos que representam ADO.NET dados relacionais. A XmlElement matriz e de tipos é suportada XmlNode como uma forma de representar XML diretamente. Além disso, os tipos que implementam a IXmlSerializable interface são suportados, incluindo o atributo relacionado XmlSchemaProviderAttribute e os XDocument tipos e XElement . O tipo ADO.NETDataTable e o DataSet tipo (bem como suas classes derivadas tipadas) implementam a IXmlSerializable interface e, portanto, se encaixam nessa categoria. Para obter mais informações, consulte Tipos XML e ADO.NET em contratos de dados.
Limitações do uso de certos tipos no modo de confiança parcial
A seguir está uma lista de limitações ao usar certos tipos em cenários de modo de confiança parcial:
Para serializar ou desserializar um tipo que implementa ISerializable em código parcialmente confiável usando as DataContractSerializer permissões requires the SerializationFormatter e UnmanagedCode .
Ao executar o código WCF no modo de confiança parcial, a serialização e desserialização de campos (ambos
public
eprivate
) não é suportadareadonly
. Isso ocorre porque a IL gerada não é verificável e, portanto, requer permissões elevadas.Tanto o quanto o DataContractSerializer são suportados XmlSerializer em um ambiente de confiança parcial. No entanto, a utilização do DataContractSerializer medicamento está sujeita às seguintes condições:
Todos os tipos serializáveis
[DataContract]
devem ser públicos.Todos os campos ou propriedades serializáveis
[DataMember]
em um[DataContract]
tipo devem ser públicos e leitura/gravação. A serialização e desserialização de campos não é suportadareadonly
ao executar WCF em um aplicativo parcialmente confiável.O
[Serializable]
/ISerializable]
modelo de programação não é suportado em um ambiente de confiança parcial.Os tipos conhecidos devem ser especificados no código ou na configuração no nível da máquina (
Machine.config
). Os tipos conhecidos não podem ser especificados na configuração no nível do aplicativo por motivos de segurança.
Os tipos que implementam IObjectReference lançam uma exceção em um ambiente parcialmente confiável porque o GetRealObject método requer a permissão
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
de segurança.
Notas adicionais sobre serialização
As regras a seguir também se aplicam aos tipos suportados pelo Data Contract Serializer:
Os tipos genéricos são totalmente suportados pelo serializador de contrato de dados.
Os tipos de valor anulável são totalmente suportados pelo serializador de contrato de dados.
Os tipos de interface são tratados como Object ou, no caso de interfaces de coleção, como tipos de coleção.
Ambas as estruturas e classes são suportadas.
O DataContractSerializer não suporta o modelo de programação usado pelos XmlSerializer e ASP.NET serviços Web. Em particular, ele não suporta atributos como XmlElementAttribute e XmlAttributeAttribute. Para habilitar o suporte para esse modelo de programação, o WCF deve ser alternado para usar o XmlSerializer em vez do DataContractSerializer.
O DBNull tipo é tratado de uma forma especial. É um tipo singleton e, após a desserialização, o desserializador respeita a restrição singleton e aponta todas as
DBNull
referências para a instância singleton. PorDBNull
ser um tipo serializável, ele exige SerializationFormatter permissão.