none
Serialização/Deserialização Dictionary<valor, objeto> RRS feed

  • Pergunta

  • Senhores bom dia,

    Preciso serializar um dictionary em um webservice e deserializá-lo em uma aplicação cliente que consome esse webservice. É possível? estou tendo problemas e já procurei bastante na internet e não estou tendo sucesso. Para visualizar a idéia imagine que esse dicionário seria permissão de acesso de um cliente à X sistemas por exemplo.

    Grato pela ajuda.
    segunda-feira, 1 de fevereiro de 2010 14:11

Respostas

  • meu caro, implemente Dictionary<string, object> na classe mencionada como exemplo e testando me responda se é tão simples assim. Encontrei uma solução sim mas não foi essa.
    • Marcado como Resposta Helio Gatts quarta-feira, 3 de fevereiro de 2010 12:04
    quarta-feira, 3 de fevereiro de 2010 12:03

Todas as Respostas

  • Amigo, para você serializar uma classe, é só usar o atributo serializable:

    C#
    [Serializable]
    public class Classe1 {
    
    
    }

    VB.NET

    <Serializable()>
    Class Classe1
    
    End Class

    Ai você pode retornar uma collection com essa classe do seu WebService normalmente, o camarada que receber não precisar fazer nada para deserializar.

    Mas se você for mandar isso para um arquivo  (texto por exemplo)  terá de usar o BinaryFormatter tanto para serializar quanto deserializar.

    Abraços!

    André Luiz de Rocha Castro
    terça-feira, 2 de fevereiro de 2010 17:06
  • meu caro, implemente Dictionary<string, object> na classe mencionada como exemplo e testando me responda se é tão simples assim. Encontrei uma solução sim mas não foi essa.
    • Marcado como Resposta Helio Gatts quarta-feira, 3 de fevereiro de 2010 12:04
    quarta-feira, 3 de fevereiro de 2010 12:03
  • Bom Dia Helio,

    Tive um problema parecido com o seu, para serializar um objeto do tipo KeyValuePair gerado em um Webservice e que estava chegando nulo no consumo do objeto. A solução que adotei foi a Serialização e Compactação (opcional) do objeto, transformando-o em um Array de Bytes para ser deserializado na aplicação cliente. O código no Webservice ficou assim:

                    List<KeyValuePair<AirPort, List<LoadUnloadPoint>>> lAirport = null; // Classe a ser serializada

                        lAirport = CarregaObjeto; // Metodo para preencher o objeto

                        // cria um novo MemoryStream .
                        System.IO.MemoryStream _MemoryStream = new System.IO.MemoryStream();

                        // cria um novo BinaryFormatter .
                        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter _BinaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

                        // serializa o objeto no stream.
                        _BinaryFormatter.Serialize(_MemoryStream, lAirport);

                       // Opcionalmente, pode-se compactar o objeto para que o volume de dados trafegado na web seja menor

                        System.IO.MemoryStream stream = new System.IO.MemoryStream();
                        System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Compress);
                        zip.Write(_MemoryStream.ToArray(), 0, _MemoryStream.ToArray().Length);
                        zip.Close();
                        stream.Close();

                        // Transforma o objeto em um array de bytes e retorna no metodo do Webservice

                        return stream.ToArray();

     

    Após retornar o array de bytes, faz-se a operação inversa no cliente, para descompactar e deserializar o objeto e ele estara intacto e integro no cliente. O código para descompactar é o seguinte:

                    byte[] LAirport = obj.LAirport; // este é o array de bytes recebido do Webservice
                    MemoryStream stream = new MemoryStream(LAirport);

                    // Utilizando o GZipStream, cria-se o descompactador com o stream recebido
                    System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
                    // cria-se um novo MemoryStream para receber o objeto descompactado
                    System.IO.MemoryStream _MemoryStream = new System.IO.MemoryStream();
                    zip.CopyTo(_MemoryStream);

                    // cria-se um novo BinaryFormatter para deserializar o objeto.
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter _BinaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

                    // deserializa o objetopara o dicionario novamente.
                    _MemoryStream.Position = 0;

                    (List<KeyValuePair<AirPort, List<LoadUnloadPoint>>>) lAirport;
                    lAirport = (List<KeyValuePair<AirPort, List<LoadUnloadPoint>>>)_BinaryFormatter.Deserialize(_MemoryStream);
                    _MemoryStream.Close();

     

    Pronto, desta forma o item lAirport está reconstruido.

    Sds,

    quarta-feira, 1 de setembro de 2010 13:06