我想序列化一个具有自定义IEqualityComparer
。
我已尝试使用DataContractSerializer
但我无法将Comparer
序列化。
由于this,我无法使用BinaryFormatter
。
我总是可以这样做:
var myDictionary = new MyDictionary(deserializedDictionary, myComparer);
但这意味着我需要两倍于字典使用的内存。
答案 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 ); } }