none
Problema DataContract com uma propriedade do tipo object RRS feed

  • Pergunta

  • Boas galera,

    Estou construindo uma solução aqui e me deparei com um problema. O cenario que eu tenho é o seguinte:

    Tenho dois contratos que são utilizados em todas as camadas (serviços) da solução. Esses contratos expõem operações que são comuns a todos os niveis. Em cada camada, eu tenho um terceiro contrato, que é o contrato de necessidades especificas de cada camada. Pra não replicar codigo, utilizo de herança de Contratos (interfaces) e  implemento as operações no meu serviço.

    Como DataContract, tenho umas classes e dentre elas, tenho uma classe com uma propriedade do tipo object. Esses DataContracts estão organizados da seguite forma:

    ClasseA conten uma propriedade do tipo ClasseB que por sua vez contem uma propriedade do tipo object. A necessidade de ser object é porque ela deve ser generica e aceitar N tipos diferentes de conteudo. Tentei utilizar Generics, porem não funfou. Quando tento invocar uma operação de um dos niveis, onde recebo um objeto do tipo ClasseA, recebo um exception informando que o tipo de dados passado não é esperado.

    There was an error while trying to serialize parameter http://tempuri.org/:ClassA. The InnerException message was 'Type 'MyNamespace.ClassC' with data contract name 'ClassC:http://schemas.datacontract.org/2004/07/MyNamespace' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'.  Please see InnerException for more details.

    Eu percebi que se alterasse o tipo da propriedade para o tipo que eu estava passando, o serviço funcionava normalmente, porem eu teria que duplicar codigos e alterar a estrutura dos serviços.

    Tentei utilizar os atributos [KnownType] e  [ServiceKnownType] porem o resultado foi o mesmo.

    Ele me sugere utilizar um DataContractResolver, porem não sei como isso deve ser implementado. Alguem tem algum bom exemplo disso, ou um outra solução possivel?

     

    Obrigado

     

    sexta-feira, 25 de fevereiro de 2011 14:02

Respostas

Todas as Respostas