将字典写入XML不起作用

时间:2016-03-04 03:55:09

标签: c# xml dictionary serialization xmlserializer

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

1 个答案:

答案 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;
        }
    }