C# 将字典写入XML文件´;行不通

C# 将字典写入XML文件´;行不通,c#,xml,dictionary,serialization,xmlserializer,C#,Xml,Dictionary,Serialization,Xmlserializer,我之前问过如何为文件编写词典,后来被引用了 所以,我试图使用它,但我有一个问题,它总是生成一个空文件。 我做错了什么 我有: private static void Serialize(TextWriter writer, IDictionary dictionary) { List<Entry> entries = new List<Entry>(dictionary.Count); foreach (object

我之前问过如何为文件编写词典,后来被引用了

所以,我试图使用它,但我有一个问题,它总是生成一个空文件。 我做错了什么

我有:

        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;
和项目。。是一个相当复杂的物体

我做错了什么?如何让它工作?或者只是不可能像这样将MyConfig中的数组压缩到文件中

编辑:

公共类项{
公共项(多个参数){}
不管怎样;
短什么2;
字节bla;
字符串名,
列出包装材料;
ItemCache;
//许多能手
}
公共类ItemCache{
公共项缓存(多个参数){}
列表cC;
}
公共类包装器{
列出补习班;
字符串名;
单元id;
}
您链接到的链接有错误
XmlSerializer
要求要序列化的所有类型都可以提前静态地发现。但是,
条目
类具有非泛型的
对象
键和值,因此情况并非如此

相反,使用泛型,因为这样做将静态地指定它们的键和值类型:

    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;
        }
    }
私有静态void序列化(TextWriter,IDictionary dictionary)
{
var entries=dictionary.Select(pair=>newentry(pair.Key,pair.Value)).ToList();
var serializer=新的XmlSerializer(entries.GetType());
序列化器。序列化(编写器、条目);
}
私有静态void反序列化(TextReader,IDictionary dictionary)
{
var serializer=newxmlserializer(typeof(List));
变量列表=(列表)序列化程序。反序列化(读取器);
dictionary.Clear();
foreach(列表中的var条目)
{
dictionary[entry.Key]=entry.Value;
}
}
公开课入学
{
公钥;
公共价值;
公共条目(){}
公共输入(TKey键、TValue值)
{
钥匙=钥匙;
价值=价值;
}
}

Hmm这是否意味着旧版本不起作用,因为数据是动态添加的,而不是在代码开始时添加的?不幸的是,我得到了同样的行为,它生成了一个完全空的FIle@user3314624-如果我尝试使用您的代码序列化字典,它会抛出
System.invalidoOperationException:生成XML文档时出错。-->System.InvalidOperationException:不应为MyConfig类型。
。如果我使用泛型版本,我可以成功地序列化它。看见异常将解释空文件。但是您的问题不完整-它不包括
类。因此,可能还有其他问题。你能提供你的问题的答案吗?我没有访问该类的权限。我只能用它。但是我试图总结其中的内容,尽管这没有帮助:/@user3314624-您的
类(如图所示)没有无参数构造函数<如果要序列化的任何类没有无参数构造函数,code>XmlSerializer将引发异常。看见同样,您可能会遇到多个困难,因此我建议您尝试将您的问题简化为多个问题,我们可以提供帮助。@user3314624-另外,您是否捕获并记录异常?如果您是,这将非常有用,并且可以共享每个文件的完整“ToString()”输出,包括消息、回溯和内部异常。
    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;    
}
    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;
        }
    }