XML-сериализация словаря с пользовательским IEqualityComparer - PullRequest
3 голосов
/ 14 декабря 2008

Я хочу сериализовать словарь с пользовательским IEqualityComparer.

Я пытался использовать DataContractSerializer, но не могу получить сериализацию Comparer.

Я не могу использовать BinaryFormatter из-за этого .

Я всегда могу сделать что-то вроде:

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

Но это означает, что мне понадобится вдвое больше памяти, чем использует словарь.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2008

Почему пользовательский 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 );
    }
}

0 голосов
/ 14 декабря 2008

Я только что прочитал сообщение об ошибке ...

Сбой двоичной сериализации для объекта графики с более чем ~ 13,2 миллиона объекты.

если у вас такой большой график, у вас всегда могут быть проблемы.

Хотите попробовать альтернативный сериализатор? «protobuf-net» - это специальный двоичный сериализатор, соответствующий формату буферов протокола Google, и может работать для больших наборов, особенно в режиме «группа».

...