Pergunta

Com a XmlSerializer eu posso ter meus membros em diferentes namespaces com o tipo de pai.

Posso fazer a mesma coisa com DataContractSerializer?

Eu gostaria o seguinte XML:

<h:Type xmlns:h="http://schemas.e.com/WebServices"
    xmlns="http://schemas.e.com/WebServices">
  <Member xmlns="http://schemas.e.com/CoreTypes">0</Member>
</h:Type>

Isso é possível com DataContractSerializer?

Foi útil?

Solução

Você pode definir subdatacontracts em diferentes namespaces e usá-los como membros de outra DataContract, mas você não pode controlar os nomes e / ou formas de membros individuais. O DataContractSerializer não se destina a substituir XmlSerializer para o controle de grão fino da "forma" de seu XML.

Outras dicas

Embora seja verdade como indicado na esta resposta por nitzmahone que um tipo de contrato de dados específico não pode ter declarado membros em vários espaços de nomes, é possível que, em um tipo de hierarquia , tipos derivados podem pertencer a diferentes dados namespaces contratos do que os tipos de base a partir do qual eles herdam. Quando isso acontece, cada membro vai ser serializado para o namespace no qual é declarou . Ao construir uma hierarquia de tipo apropriado, entidades XML com membros em namespaces diferentes pode ser (de) serializado por DataContractSerializer.

As regras específicas são as seguintes:

  1. Se um tipo de contrato de dados é uma parte de uma hierarquia de herança, membros dos seus tipos base de dados estão sempre em primeiro lugar na ordem. 1

  2. Os membros de dados são serializados para o namespace de contrato de dados do tipo de membro de dados em que são declarados.

  3. O namespace raiz de um tipo de contrato de dados é o namespace de seu tipo mais derivado.

  4. elementos XML são (de) serializado na ordem especificada por dados Order Membro . DataContractSerializer não permite a membros de dados a serem reordenadas livremente durante a desserialização. 2

  5. coleções têm suas próprias regras como especificado no Tipos de Coleção de dados Contratos ; esta resposta não se aplica a eles.

Assim, o XML na questão pode ser consumido por DerivedType na seguinte hierarquia de tipo:

[DataContract(Name = "Base", Namespace = "http://schemas.e.com/CoreTypes")]
public class BaseType
{
    [DataMember]
    public int Member { get; set; }
}

[DataContract(Name = "Type", Namespace = "http://schemas.e.com/WebServices")]
public class DerivedType : BaseType
{
}

E, em geral, qualquer sequência de elementos XML em qualquer sequência de namespace (s) podem ser obtidos por aplicação das regras acima para construir uma hierarquia de tipo apropriado, oferecendo uma solução que satisfaz a exigência de deserializing elementos em diferentes namespaces.

Claro que, tal hierarquia pode ser inconveniente para outras razões, caso em que os tipos de modelo de dados preferidos podem ser substituídos por DTOs usando a contrato de dados substituto mecanismo.


1 Order membro de dados .

2 Order Membro de Dados e XML Deserialization

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top