使用不区分大小写的字符串比较器</string,>初始化字典时序列化Dictionary <string,object =“”>

时间:2010-08-09 13:30:46

标签: c# dictionary xml-serialization .net-4.0

我将字典序列化为XML。当我创建一个新的字典时,我使用构造函数来提供没有外壳的EqualityComparer例如

var tabs = new Dictionary<string,Tab>(StringComparer.OrdinalIgnoreCase);

然后我序列化为XML,当我反序列化有关套管的信息丢失时 - 使用GenericEqualityComparer对字典进行反序列化,这显然是区分大小写的,因为如果它们没有正确套装,它就找不到我的密钥。 / p>

任何想法如何更改?

一种方法是创建一个新字典并将数据从反序列化复制到新字典,但这看起来很麻烦。

更新:

反序列化一直在工作,它只是将序列化的字典序列化为不使用不区分大小写的键的字典。

4 个答案:

答案 0 :(得分:4)

我知道这个问题很老,但我最近发现自己正在寻找如何做到这一点。

使用.Net4(就像@mare所说),你可以创建一些非常好的扩展方法来使这变得轻而易举。查看https://stackoverflow.com/a/5941122/435460以获得简单易用的实现。

经过大量的挖掘,这对我来说就像是一种魅力。

答案 1 :(得分:3)

修改

根据评论,似乎这种方法在.NET 4中可能已经过时。

结束修改

字典恰好需要一些帮助来序列化和反序列化。

以下是XML Serializable字典的一个很好的例子:

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

您可以通过更改类声明并添加构造函数并调整行来使其不区分大小写。

**编辑:更正了下面的语法错误。 /编辑**

public class SerializableDictionary<TValue>
    : Dictionary<string, TValue>, IXmlSerializable
{
    public SerializableDictionary()
        : base(StringComparer.InvariantCultureIgnoreCase)
    {
    }

    // ...
}

将行this.Add(key, value);更改为this[key] = value;

无论如何,你可能需要按摩一些细节,但这样可以让你顺利上路。

答案 2 :(得分:1)

您只需在构造函数中包装新词典:

Dictionary<string, Tab> tabs ;
tabs = new Dictionary<string, Tab>((Dictionary<string, Tab>)serializer.ReadObject(reader),StringComparer.OrdinalIgnoreCase);

答案 3 :(得分:1)

我意识到一个古老的问题,但只是将源头挖掘到Dictionary并注意到它实际上应该序列化Comparer:

info.AddValue(ComparerName, comparer, typeof(IEqualityComparer<tkey>));

然后在IDeserializationCallback.OnDeserialization的实现中,它检索Comparar:

comparer = (IEqualityComparer<tkey>)m_siInfo.GetValue(ComparerName, typeof(IEqualityComparer<tkey>));

实现接口IDeserializationCallback的类指定了一个方法,该方法应该在反序列化实例之后但在返回到代码之前执行。

参考:Dictionary.cs GetObjectData和OnDeserialization方法