我之前问过如何将字典写入文件并引用http://web.archive.org/web/20100703052446/http://blogs.msdn.com/b/psheill/archive/2005/04/09/406823.aspx
所以,我正在尝试使用它,但我遇到的问题是它始终生成一个空文件。 我做错了什么?
我有:
private static void Serialize(TextWriter writer, IDictionary dictionary)
{
List<Entry> entries = new List<Entry>(dictionary.Count);
foreach (object key in dictionary.Keys)
{
entries.Add(new Entry(key, dictionary[key]));
}
System.Xml.Serialization.XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>));
serializer.Serialize(writer, entries);
}
private static void Deserialize(TextReader reader, IDictionary dictionary)
{
dictionary.Clear();
XmlSerializer serializer = new XmlSerializer(typeof(List<Entry>));
List<Entry> list = (List<Entry>)serializer.Deserialize(reader);
foreach (Entry entry in list)
{
dictionary[entry.Key] = entry.Value;
}
}
public class Entry
{
public object Key;
public object Value;
public Entry()
{
}
public Entry(object key, object value)
{
Key = key;
Value = value;
}
}
}
private void saveConfig()
{
TextWriter writer = File.CreateText("C:\\Users\\test.xml");
Serialize(writer, this.configuration);
}
private Dictionary<String, MyConfig> configuration;
其中:
public class MyConfig{ public Item[] items=new Item[64];}
和Item ..是一个非常复杂的对象。
我在这里做错了什么?如何让它工作?或者是不可能将MyConfig中的数组传播到FIle那样的?
编辑:
public class Item {
public Item(many params){}
uint whatever;
short whatever2;
byte bla;
String name,
List<Wrapper> wrappers;
ItemCache cache;
//many getters
}
public class ItemCache{
public ItemCache(many Params){}
List<CodeCache> cC;
}
public class Wrapper{
List<Cram> crams;
String name;
uint id;
}
答案 0 :(得分:0)
您链接的article有误。 XmlSerializer
要求所有要序列化的类型都可以提前静态发现。但是,Entry
类具有非通用object
键和值,因此情况并非如此。
相反,使用泛型,因为这样做将静态指定它们的键和值类型:
private static void Serialize<TKey, TValue>(TextWriter writer, IDictionary<TKey, TValue> dictionary)
{
var entries = dictionary.Select(pair => new Entry<TKey, TValue>(pair.Key, pair.Value)).ToList();
var serializer = new XmlSerializer(entries.GetType());
serializer.Serialize(writer, entries);
}
private static void Deserialize<TKey, TValue>(TextReader reader, IDictionary<TKey, TValue> dictionary)
{
var serializer = new XmlSerializer(typeof(List<Entry<TKey, TValue>>));
var list = (List<Entry<TKey, TValue>>)serializer.Deserialize(reader);
dictionary.Clear();
foreach (var entry in list)
{
dictionary[entry.Key] = entry.Value;
}
}
public class Entry<TKey, TValue>
{
public TKey Key;
public TValue Value;
public Entry() { }
public Entry(TKey key, TValue value)
{
Key = key;
Value = value;
}
}