我想序列化具有自定义IEqualityComparer.
我试过使用DataContractSerializer,但我无法Comparer序列化。
BinaryFormatter因为这个我不能用。
我总是可以做类似的事情:
var myDictionary = new MyDictionary(deserializedDictionary, myComparer);
但这意味着我需要两倍于字典使用的内存。
我想序列化具有自定义IEqualityComparer.
我试过使用DataContractSerializer,但我无法Comparer序列化。
BinaryFormatter因为这个我不能用。
我总是可以做类似的事情:
var myDictionary = new MyDictionary(deserializedDictionary, myComparer);
但这意味着我需要两倍于字典使用的内存。
为什么自定义的 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 );
}
}
我刚刚阅读了错误报告...
对于超过 1320 万个对象的对象图,二进制序列化失败。
如果你有一个那么大的图表,你总是可能会遇到一些问题。
您想尝试替代序列化程序吗?“protobuf-net”是一个定制的二进制序列化器,遵循 Google 的协议缓冲区格式,可能适用于更大的集合,尤其是在“组”模式下。