Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

11
respostas

Dúvida Dictionary em WCF C#

Bom dia Senhores e Senhoras,

Tenho um WCF em C# configurado para serializar em json a resposta. Estou querendo adicionar uma lista em um dictionary porém ele não consegue enviar a resposta. Não estoura exception, já coloquei em try catch. Mas caso eu não coloque a lista ele funciona. Acredito que ele não esteja conseguindo serializar

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using Newtonsoft.Json;

namespace Metodos.Util
{
    [Serializable]
    public class AjaxDictionary<TKey, TValue> : ISerializable
    {
        private Dictionary<TKey, TValue> _Dictionary;
        public AjaxDictionary()
        {
            _Dictionary = new Dictionary<TKey, TValue>();
        }
        public AjaxDictionary(SerializationInfo info, StreamingContext context)
        {
            _Dictionary = new Dictionary<TKey, TValue>();
        }
        public TValue this[TKey key]
        {
            get { return _Dictionary[key]; }
            set { _Dictionary[key] = value; }
        }
        public void Add(TKey key, TValue value)
        {
            _Dictionary.Add(key, value);
        }
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            foreach (TKey key in _Dictionary.Keys)
                info.AddValue(key.ToString(), _Dictionary[key]);
            //JsonConvert.SerializeObject(info);
        }
    }
}

Essa classe estou utilizando para fazer a serialização de dictionary para json. Essa classe faz com que chave e valor fiquem de acordo como está com o dictionary. Grato pela atenção

11 respostas

Olá, Lucas

Como você está usando esse dicionárioAjaxDictionary` na aplicação? Quais são os tipos da chave e do valor (TKey e TValue) armazenados no dicionário? Talvez ele não esteja conseguindo serializar esses tipos.

o tipo do AjaxDictionary é <string, Object> e este está recebendo um AjaxDictionary<string, List> em uma de suas posições, porém quando ele efetua o GetObjectData da classe AjaxDictionary não funciona. Então estou implementando uma modificação nesse método para converter lista dentro do dictionary.

Você pode colocar aqui o código onde popula o AjaxDictionary? E quanto à lista em AjaxDictionary? Esse List não é uma lista genérica? Que elementos ela pode conter?

AjaxDictionary<string, object> dictionary = new AjaxDictionary<string,object>();

 AjaxDictionary<string, List<Cartao>> card = new AjaxDictionary<string, List<Cartao>>();

List<Cartao> cartao = new List<Cartao>();
            cartao.Add(new Cartao() { idCartao = 1, bannerCard = "BANNER", numberCard = 2222222222222222});

card["card"] = cartao;

 dictionary["variavel1"] = "00";
            dictionary["variavel2"] = "Nova versão disponível. Melhorias foram feitas. ";
            dictionary["variavel3"] = "false";
            dictionary["variavel4"] = "";
            dictionary["variavel5"] = "";
            dictionary["variavel6"] = "S";
            dictionary["variavel7"] = card;

É basicamente esse código

Lucas,

Veja se sua classe Cartao está com atributos de serialização: (DataContract, DataMember) como no exemplo abaixo:

[DataContract]
    public class Cartao
    {
        [DataMember]
        public intidCartao { get; set; }

        [DataMember]
        public string bannerCard { get; set; }

        [DataMember]
        public string numberCard { get; set; }
    }

Adicionei o que foi informado mas mesmo assim tenho o mesmo erro na execução no postman:

Could not get any response

Estava debugando aqui a variável info em GetObjectData e encontrei erros dentro do objectType no debbug dentro dela no

ObjectType/ DeclaringMethod = '((System.RuntimeType)info.ObjectType).DeclaringMethod' threw an exception of type 'System.InvalidOperationException'

mesmo erro para GenericParameterAttribute e GenericParameterPosition

Esse é um erro de reflection. Talvez você não deva usar object no tipo do valor do dicionário. Tente trocar o tipo do dicionário:

De:

AjaxDictionary<string, object> dictionary = new AjaxDictionary<string,object>();

por

AjaxDictionary<string, string> dictionary = new AjaxDictionary<string, string>();

deixou de aparecer o erro porém não converteu a list para chave valor para a posição card. Detalhe alterei o recebimento da lista no dictionary colocando toString() no final da lista ficando : dictionary["card"] = cartao.ToString();

Ainda continuo com o erro

Alguém poderia me ajudar?