Развивая мою предыдущую проблему , я решил (де) сериализовать мой класс конфигурационного файла, который работал отлично.
Теперь я хочу , чтобы хранить ассоциативный массив букв на карту (ключ буква диска, значение сетевого путь) и попытался использовать Dictionary
, HybridDictionary
и Hashtable
для этого , но я всегда получаю следующее сообщение об ошибке при вызове ConfigFile.Load()
или ConfigFile.Save()
:
Произошла ошибка, отражающая тип «App.ConfigFile». [snip] System.NotSupportedException: не удается сериализовать член App.Configfile.mappedDrives [snip]
Из того, что я прочитал, словари и HashTables можно сериализовать, так что я делаю не так?
[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();
}
}
}
}
источник
DataContractSerializer
класс может это сделать. Просто выход немного уродливый.Есть решение в блоге Пола Уэлтера - XML Serializable Generic Dictionary
источник
string
значения, но приInvalidOperationException
десериализации будет появляться упоминание неожиданного элемента-обертки, если вы попытаетесь сохранить в нем пользовательские объекты или строковые массивы. (См. Мой вопрос для примера проблем, с которыми я столкнулся.)Вместо использования
XmlSerializer
вы можете использоватьSystem.Runtime.Serialization.DataContractSerializer
. Это может сериализовать словари и интерфейсы без проблем.Вот ссылка на полный пример, http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
источник
Создать суррогат сериализации.
Например, у вас есть класс с открытым свойством типа Dictionary.
Чтобы поддерживать сериализацию Xml этого типа, создайте общий класс ключ-значение:
Добавьте атрибут XmlIgnore к исходному свойству:
Предоставьте открытое свойство типа массив, которое содержит массив экземпляров SerializableKeyValue, которые используются для сериализации и десериализации в свойство SearchCategories:
источник
Вы должны изучить Json.Net, довольно простой в использовании и позволяющий десериализовать объекты Json непосредственно в словаре.
james_newtonking
пример:
источник
Словари и Hashtables не сериализуются с
XmlSerializer
. Поэтому вы не можете использовать их напрямую. Обходной путь должен был бы использоватьXmlIgnore
атрибут, чтобы скрыть эти свойства от сериализатора и представить их через список сериализуемых пар ключ-значение.PS: создание
XmlSerializer
очень дорого, поэтому всегда кешируйте его, если есть возможность его повторного использования.источник
Я хотел класс SerializableDictionary, который использовал атрибуты xml для ключа / значения, поэтому я адаптировал класс Пола Уэлтера.
Это производит XML как:
Код:
Модульные тесты:
источник
класс Dictionary реализует ISerializable. Определение словаря классов дано ниже.
Я не думаю, что это проблема. см. ссылку ниже, в которой говорится, что если у вас есть какой-либо другой тип данных, который не сериализуем, тогда Словарь не будет сериализован. http://forums.asp.net/t/1734187.aspx?Is+Dictionary+serializable+
источник
Вы можете использовать ExtendedXmlSerializer . Если у вас есть класс:
и создайте экземпляр этого класса:
Вы можете сериализовать этот объект, используя ExtendedXmlSerializer:
Выходной xml будет выглядеть так:
Вы можете установить ExtendedXmlSerializer из nuget или выполнить следующую команду:
Вот онлайн пример
источник
В этой статье объясняется, как именно это сделать : как ... Сериализировать хеш-таблицу в C #, когда приложение требует этого?
Я надеюсь, что это полезно
источник