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?