为了账号安全,请及时绑定邮箱和手机立即绑定

序列化包含字典成员的类

序列化包含字典成员的类

C#
慕容708150 2019-07-25 14:13:42
序列化包含字典成员的类扩展到我的早期问题,我决定序列化我的config文件类,它运行得很好。我现在想要存储要映射的驱动器字符的关联数组(键是驱动器字母,值是网络路径),并尝试使用Dictionary, HybridDictionary,和Hashtable但是,在调用时总是会收到以下错误ConfigFile.Load()或ConfigFile.Save():反映类型‘App.ConfigFile’时出错。[Snip]System.NotSupportdException:无法序列化成员App.Configfile.mempdDrives[Snip]根据我所读过的字典和HashTables可以被序列化,那么我做错了什么呢?[XmlRoot(ElementName="Config")]public class ConfigFile{     public String guiPath { get; set; }     public string configPath { get; set; }     public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();     public Boolean Save(String filename)     {         using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))         {             try             {                 var serializer = new XmlSerializer(typeof(ConfigFile));                 serializer.Serialize(filestream, this);                 return true;             } catch(Exception e) {                 MessageBox.Show(e.Message);                 return false;             }         }     }     public void addDrive(string drvLetter, string path)     {         this.mappedDrives.Add(drvLetter, path);     }     public static ConfigFile Load(string filename)     {         using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))         {             try             {                 var serializer = new XmlSerializer(typeof(ConfigFile));                 return (ConfigFile)serializer.Deserialize(filestream);             }             catch (Exception ex)             {                 MessageBox.Show(ex.Message + ex.ToString());                 return new ConfigFile();             }         }     }}
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

创建序列化代理项。

例如,您有一个类,它的公共属性为Dictionary类型。

要支持这种类型的XML序列化,请创建一个泛型键值类:

public class SerializeableKeyValue<T1,T2>{
    public T1 Key { get; set; }
    public T2 Value { get; set; }}

向原始属性添加XmlIgnore属性:

    [XmlIgnore]
    public Dictionary<int, string> SearchCategories { get; set; }

公开一个数组类型的公共属性,该属性包含一个SerializableKeyValue实例数组,用于序列化并反序列化为SearchCollection属性:

    public SerializeableKeyValue<int, string>[] SearchCategoriesSerializable
    {
        get        {
            var list = new List<SerializeableKeyValue<int, string>>();
            if (SearchCategories != null)
            {
                list.AddRange(SearchCategories.Keys.Select(key => new SerializeableKeyValue<int, string>()
                 {Key = key, Value = SearchCategories[key]}));
            }
            return list.ToArray();
        }
        set
        {
            SearchCategories = new Dictionary<int, string>();
            foreach (var item in value)
            {
                SearchCategories.Add( item.Key, item.Value );
            }
        }
    }



查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 276 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信