3

我想序列化具有自定义IEqualityComparer.

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

BinaryFormatter因为这个我不能用。

我总是可以做类似的事情:

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

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

4

2 回答 2

0

为什么自定义的 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 );
    }
}

于 2008-12-14T19:54:24.520 回答
0

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

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

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

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

于 2008-12-14T15:52:59.250 回答