XML serialization of a Dictionary with a custom IEqualityComparer

天涯浪子 提交于 2020-02-15 09:15:59

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!