Expandindo meu problema anterior , decidi (de) serializar minha classe de arquivo de configuração, que funcionou muito bem.
Agora eu quero armazenar uma matriz associativa de letras de unidade para mapear (chave é a letra da unidade, o valor é o caminho de rede) e tentei usar Dictionary
, HybridDictionary
e Hashtable
para isso, mas eu sempre obter o seguinte erro ao chamar ConfigFile.Load()
ou ConfigFile.Save()
:
Ocorreu um erro ao refletir o tipo 'App.ConfigFile'. [snip] System.NotSupportedException: não é possível serializar o membro App.Configfile.mappedDrives [snip]
Pelo que li, os Dicionários e o HashTables podem ser serializados, então o que estou fazendo de errado?
[XmlRoot(ElementName="Config")]
public class ConfigFile
{
public String guiPath { get; set; }
public string configPath { get; set; }
public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();
public Boolean Save(String filename)
{
using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
serializer.Serialize(filestream, this);
return true;
} catch(Exception e) {
MessageBox.Show(e.Message);
return false;
}
}
}
public void addDrive(string drvLetter, string path)
{
this.mappedDrives.Add(drvLetter, path);
}
public static ConfigFile Load(string filename)
{
using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
return (ConfigFile)serializer.Deserialize(filestream);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.ToString());
return new ConfigFile();
}
}
}
}
fonte
DataContractSerializer
classe pode fazer isso. Apenas a saída é um pouco feia.Há uma solução no Weblog - Dicionário Genérico Serializável XML de Paul Welter
fonte
string
valores, mas acionará umaInvalidOperationException
desserialização mencionando um elemento inesperado do wrapper se você tentar armazenar objetos personalizados ou matrizes de strings nele. (Veja a minha pergunta para um exemplo dos problemas que eu enfrentei com isso.)Em vez de usar,
XmlSerializer
você pode usar aSystem.Runtime.Serialization.DataContractSerializer
. Isso pode serializar dicionários e interfaces sem suar.Aqui está um link para um exemplo completo, http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
fonte
Crie um substituto de serialização.
Exemplo, você tem uma classe com propriedade pública do tipo Dictionary.
Para oferecer suporte à serialização Xml desse tipo, crie uma classe de valor-chave genérica:
Adicione um atributo XmlIgnore à sua propriedade original:
Exponha uma propriedade pública do tipo matriz, que contém uma matriz de instâncias SerializableKeyValue, que são usadas para serializar e desserializar na propriedade SearchCategories:
fonte
Você deve explorar o Json.Net, bastante fácil de usar e permitir que os objetos Json sejam desserializados diretamente no Dictionary.
james_newtonking
exemplo:
fonte
Dicionários e Hashtables não podem ser serializados com
XmlSerializer
. Portanto, você não pode usá-los diretamente. Uma solução alternativa seria usar oXmlIgnore
atributo para ocultar essas propriedades do serializador e expô-las por meio de uma lista de pares de valores-chave serializáveis.PS: construir um
XmlSerializer
é muito caro, portanto, sempre o armazene em cache se houver uma chance de poder reutilizá-lo.fonte
Eu queria uma classe SerializableDictionary que usasse atributos xml para key / value, então adaptei a classe de Paul Welter.
Isso produz xml como:
Código:
Testes unitários:
fonte
a classe Dictionary implementa ISerializable. A definição de dicionário de classes é dada abaixo.
Eu não acho que esse seja o problema. consulte o link abaixo, que diz que se você estiver tendo outro tipo de dados que não seja serializável, o Dicionário não será serializado. http://forums.asp.net/t/1734187.aspx?Is+Dictionary+serializable+
fonte
Você pode usar o ExtendedXmlSerializer . Se você tem uma aula:
e crie uma instância desta classe:
Você pode serializar esse objeto usando o ExtendedXmlSerializer:
O xml de saída será semelhante a:
Você pode instalar o ExtendedXmlSerializer a partir do nuget ou executar o seguinte comando:
Aqui está um exemplo online
fonte
Este artigo explica exatamente como lidar com isso: Como ... Serializar uma tabela de hash em C # quando o aplicativo exigir?
Espero que isto seja útil
fonte