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:

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 (ambos public e private). 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 campos readonly 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. Como DBNull é um tipo serializável, ele exige permissão SerializationFormatter.

Confira também