问题
I want to serialize a Dictionary that has a custom IEqualityComparer
.
I've tried using DataContractSerializer
but I can't get the Comparer
to be serialized.
I can't use BinaryFormatter
because of this.
I can always do something like:
var myDictionary = new MyDictionary(deserializedDictionary, myComparer);
But that means I'd need twice the memory the dictionary uses.
回答1:
Why does the custom Comparer even need to be serialized? Here is a test case that works for me.
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 ); } }
回答2:
I just read the error report...
Binary serialization fails for object graphs with more than ~13.2 million objects.
if you have a graph that big, you always may have some problems.
Would you like to try an alternative serializer? "protobuf-net" is a bespoke binary serializer following Google's protocol buffers format, and may work for larger sets, especially in "group" mode.
来源:https://stackoverflow.com/questions/366541/xml-serialization-of-a-dictionary-with-a-custom-iequalitycomparer