我想序列化具有自定义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 的协议缓冲区格式,可能适用于更大的集合,尤其是在“组”模式下。