【问题标题】:Write Dictionary to XML doesn´t work将字典写入 XML 不起作用
【发布时间】:2016-03-04 03:55:08
【问题描述】:

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

【问题讨论】:

    标签: c# xml dictionary serialization xmlserializer


    【解决方案1】:

    您链接的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;
            }
        }
    

    【讨论】:

    • 嗯,这是否意味着旧版本无法正常工作,因为数据是动态添加的,而不是一开始就在代码本身中?不幸的是,我得到了相同的行为,它正在生成一个完全空的文件
    • @user3314624 - 如果我尝试使用你的代码序列化字典,它会抛出一个System.InvalidOperationException: There was an error generating the XML document. ---&gt; System.InvalidOperationException: The type MyConfig was not expected.。如果我使用通用版本,我可以成功序列化它。见dotnetfiddle.net/yYWyDG。异常将解释空文件。但您的问题不完整 - 它不包括 Item 类。所以可能会有额外的问题。你能提供一个complete example你的问题吗?
    • 我无权访问该课程。我只能使用它。但我试图总结其中的东西,虽然那没有帮助:/
    • @user3314624 - 如图所示,您的 Item 类没有无参数构造函数。如果要序列化的任何类没有无参数构造函数,XmlSerializer 将引发异常。见stackoverflow.com/questions/267724/…。同样,您可能会遇到多种困难,因此我建议您尝试将您的问题简化为多个mcve's,每个我们都可以提供帮助。
    • @user3314624 - 另外,您是否正在捕获和记录异常?如果您愿意,并且可以共享每个输出的完整“ToString()”输出,包括消息、回溯和内部异常,那将会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多