Tipos com suporte fornecido pelo serializador de contrato de dados
O WCF (Windows Communication Foundation) usa o DataContractSerializer como seu 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 dá suporte a muitos outros tipos, que podem ser considerados como tendo um contrato de dados implícito. Veja a seguir 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. São tipos aos quais o atributo DataContractAttribute 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. São tipos que representam listas de dados. Eles podem ser matrizes regulares de tipos ou tipos de coleção, como ArrayList e Dictionary<TKey,TValue>. O atributo CollectionDataContractAttribute 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. As enumerações, incluindo enumerações de sinalizador, são serializáveis. Como opção, os tipos de enumeração podem ser marcados com o atributo DataContractAttribute, caso em que cada membro que participa da serialização deve ser marcado com o atributo EnumMemberAttribute. 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 integrados ao .NET Framework podem ser serializados e são considerados tipos primitivos Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Object e String.
Outros tipos primitivos. Esses tipos não são primitivos no .NET Framework, mas são tratados como primitivos na forma XML serializada. Esses tipos sãoDateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedName e matrizes de Byte.
Observação
Ao contrário de outros tipos primitivos, DateTimeOffset não é um tipo conhecido por padrão. Para saber mais, confira Tipos de contrato de dados conhecidos.
Tipos marcados com o atributo SerializableAttribute. Muitos tipos incluídos na biblioteca de classes base .NET Framework se enquadram nessa categoria. O DataContractSerializer dá suporte completo a esse modelo de programação de serialização que foi usado por .NET Framework comunicação remota, o BinaryFormatter e oSoapFormatter, incluindo suporte para a interface ISerializable.
Tipos que representam XML bruto ou tipos que representam dados relacionais ADO.NET. O XmlElement e a matriz de tipos XmlNode têm suporte como uma forma de representar o XML diretamente. Além disso, tipos que implementam a interface IXmlSerializable são suportados, incluindo o atributo XmlSchemaProviderAttribute relacionado e os tipos XDocument e XElement. O tipo ADO.NETDataTable e o tipo DataSet (bem como suas classes derivadas tipadas) implementam a interface IXmlSerializable e, portanto, se encaixam nessa categoria. Para obter mais informações, consulte XML e tipos de ADO.NET em contratos de dados.
Limitações do uso de determinados tipos no modo de confiança parcial
Veja a seguir uma lista de limitações ao usar determinados 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 o DataContractSerializer são necessárias as permissões SerializationFormatter e UnmanagedCode.
Ao executar o código WCF no modo Confiança parcial , não há suporte para serialização e desserialização de campos
readonly
(ambospublic
eprivate
). Isso ocorre porque a IL gerada é não verificável e, portanto, requer permissões elevadas.Tanto DataContractSerializer quanto XmlSerializer são suportados em um ambiente de confiança parcial. No entanto, usar DataContractSerializer está sujeito às seguintes condições:
Todos os tipos serializáveis
[DataContract]
devem ser públicos.Todos os campos ou propriedades serializáveis
[DataMember]
em um tipo[DataContract]
devem ser públicos e de leitura/gravação. Não há suporte para a serialização e desserialização de camposreadonly
ao executar o WCF em um aplicativo parcialmente confiável.Não há suporte para o modelo de programação
[Serializable]
/ISerializable]
em um ambiente de confiança parcial.Os tipos conhecidos devem ser especificados na configuração de código ou de nível de máquina (
Machine.config
). 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 geram uma exceção em um ambiente parcialmente confiável porque o método GetRealObject requer a permissão de segurança
[SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)]
.
Observações adicionais sobre serialização
As seguintes regras também se aplicam aos tipos compatíveis com o Serializador de contrato de dados:
Tipos genéricos são totalmente compatíveis com o serializador de contrato de dados.
Tipos de valor anuláveis têm suporte total 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.
Há suporte para estruturas e classes.
O DataContractSerializer não dá suporte ao modelo de programação usado pelo XmlSerializer e pelos serviços Web do ASP.NET. Em particular, ele não dá suporte a 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 de DataContractSerializer.
O tipo DBNull é tratado de forma especial. É um tipo de banco de dados individual e, após a desserialização, o desserializador respeita a restrição de banco de dados individual e aponta todas as referências
DBNull
à instância de banco de dados individual. ComoDBNull
é um tipo serializável, ele exige permissão SerializationFormatter.