.NET 4.x XmlSerializer не сериализует открытые поля - C#
Формулировка задачи:
Т.к. классы, реализующие IDictionary, не серилизуются XmlSerializer (NotSupportedException), то я перевожу словарь Dicitonary<string,double> в массив KeyValuePair<string, double>[]. Свойства Key и Value у этой структуры являются открытыми, но почему-то они не сериализуются.
[Serializable] public struct KeyValuePair<TKey, TValue> { private TKey key; private TValue value; public KeyValuePair(TKey key, TValue value) { this.key = key; this.value = value; } //Открытое свойство Key public TKey Key { get { return key; } } //Открытое свойство Value public TValue Value { get { return value; } } public override string ToString() { StringBuilder s = StringBuilderCache.Acquire(); s.Append('['); if( Key != null) { s.Append(Key.ToString()); } s.Append(", "); if( Value != null) { s.Append(Value.ToString()); } s.Append(']'); return StringBuilderCache.GetStringAndRelease(s); } }
Dictionary<string, double> vals = new Dictionary<string, double> { {"Dust2", 3}, {"Mirage", 3}, {"Cache", 3}, {"Inferno", 3}, {"Overpass", 1.5}, {"Cobble", 1.5}, {"Train", 1.5}, {"Nuke", 1.5}, {"Office", 1} }; private void Run() { KeyValuePair<string, double>[] a = vals.ToArray(); XmlSerializer xmlSerializer = new XmlSerializer(a.GetType()); using (var sw = new StreamWriter("settings.xml")) { xmlSerializer.Serialize(sw, a); } }
<?xml version="1.0" encoding="utf-8"?> <ArrayOfKeyValuePairOfStringDouble xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> <KeyValuePairOfStringDouble /> </ArrayOfKeyValuePairOfStringDouble>
Решение задачи: «.NET 4.x XmlSerializer не сериализует открытые поля»
textual
Листинг программы
public void BeautySerilize(string filePath, object graph) { var settings = new XmlWriterSettings { Indent = true, IndentChars = " ", NewLineChars = "\r\n", NewLineHandling = NewLineHandling.Replace }; using (var fs = new FileStream(filePath, FileMode.Create)) using (var writer = XmlWriter.Create(fs, settings)) new DataContractSerializer(graph.GetType()).WriteObject(writer, graph); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д