【问题标题】:XML serialization of a Dictionary with a custom IEqualityComparer使用自定义 IEqualityComparer 对 Dictionary 进行 XML 序列化
【发布时间】:2008-12-14 13:18:18
【问题描述】:

我想序列化具有自定义IEqualityComparer 的字典。

我尝试过使用DataContractSerializer,但无法序列化Comparer

因为this,我不能使用BinaryFormatter

我总是可以这样做:

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

但这意味着我需要两倍于字典使用的内存。

【问题讨论】:

    标签: c# serialization dictionary xml-serialization


    【解决方案1】:

    为什么自定义的 Comparer 甚至需要被序列化? 这是一个适合我的测试用例。

    使用系统; 使用 System.Collections.Generic; 使用 System.Runtime.Serialization; 使用 System.IO; 公共类 MyKey { 公共字符串名称 { 获取;放; } 公共字符串 ID { 获取;放; } } 公共类 MyKeyComparer :IEqualityComparer { 公共布尔等于(MyKey x,MyKey y){ 返回 x.Id.Equals( y.Id ) ; } 公共int GetHashCode(MyKey obj){ 如果(obj == null) 抛出新的 ArgumentNullException(); return ((MyKey)obj).Id.GetHashCode(); } } 公共类我的字典:字典{ 公共我的字典() :base(新的MyKeyComparer()) {} } 类程序{ 静态无效主要(字符串[] args){ var myDictionary = new MyDictionary(); myDictionary.Add(new MyKey() { Name = "MyName1", Id = "MyId1" }, "MyData1" ); myDictionary.Add(new MyKey() { Name = "MyName2", Id = "MyId2" }, "MyData2" ); var ser = new DataContractSerializer( typeof( MyDictionary ) ); 使用(FileStream writer = new FileStream(“Test.Xml”,FileMode.Create)) ser.WriteObject(作家,我的字典); 使用(文件流阅读器=新文件流(“Test.Xml”,FileMode.Open)) myDictionary = (MyDictionary)ser.ReadObject( reader ); } }

    【讨论】:

    • 那是因为 ReadObject 调用了 MyDictionary 的 ctor。实际上,我要序列化的对象不是字典本身,而是几个字典和更多对象的容器。它的 ctor 不调用字典的 ctor,但我也许可以利用它,谢谢。
    【解决方案2】:

    我刚刚看了错误报告...

    对象的二进制序列化失败 超过~1320万的图表 对象。

    如果你有一个那么大的图表,你总是可能会遇到一些问题。

    您想尝试其他序列化程序吗? “protobuf-net”是一个定制的二进制序列化程序,遵循 Google 的协议缓冲区格式,可能适用于更大的集合,尤其是在“组”模式下。

    【讨论】:

    • 谢谢,试过了,但是序列化结束后我一直得到一个空流。除了用 DataContract 和 DataMember 标记我的对象之外,我还应该做些什么吗?
    • 这很奇怪......请注意,使用 DataMember(默认情况下)您需要在成员上指定一个 Order,尽管有一个用于推断订单的全局开关。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2016-03-14
    • 2015-08-01
    • 2015-11-07
    相关资源
    最近更新 更多