使用自定义IEqualityComparer的Dictionary的XML序列化

时间:2008-12-14 13:18:18

标签: c# serialization dictionary xml-serialization

我想序列化一个具有自定义IEqualityComparer

的词典

我已尝试使用DataContractSerializer但我无法将Comparer序列化。

由于this,我无法使用BinaryFormatter

我总是可以这样做:

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

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

2 个答案:

答案 0 :(得分:0)

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

  

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

如果你的图表很大,你可能会遇到一些问题。

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

答案 1 :(得分:0)

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

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.IO;

public class MyKey {
    public string Name { get; set; }
    public string Id { get; set; }
}

public class MyKeyComparer :IEqualityComparer {
    public bool Equals( MyKey x, MyKey y ) {
        return x.Id.Equals( y.Id ) ;
    }
    public int GetHashCode( MyKey obj ) {
        if( obj == null ) 
            throw new ArgumentNullException();

        return ((MyKey)obj).Id.GetHashCode();
    }
}

public class MyDictionary :Dictionary {
    public MyDictionary()
        :base( new MyKeyComparer() )
    {}
}

class Program {
    static void Main( string[] 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 ) );

        using( FileStream writer = new FileStream( "Test.Xml", FileMode.Create ) )
            ser.WriteObject( writer, myDictionary );

        using( FileStream reader = new FileStream( "Test.Xml", FileMode.Open ) )
            myDictionary = (MyDictionary)ser.ReadObject( reader );
    }
}