将字典写入 XML 不起作用

本文关键字:XML 不起作用 字典 | 更新日期: 2023-09-27 18:37:14

好吧,我之前问过如何将字典写入文件,并被引用到 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;    
}

将字典写入 XML 不起作用

您链接到的文章有误。 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;
        }
    }