Usuário com melhor resposta
Serialização/Deserialização Dictionary<valor, objeto>

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.
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
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 -
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
-
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,
- Editado Luis Claudio Souza quarta-feira, 1 de setembro de 2010 13:07 Correção