.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);
}