XML-сериализация словаря с пользовательским IEqualityComparer

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

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

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

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

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

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

14.12.2008 13:18:18
2 ОТВЕТА

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

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

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

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

0
6.12.2010 16:15:42
Спасибо, попробовал, но я получаю пустой поток после окончания сериализации. Есть ли что-то еще, что я должен сделать, кроме маркировки своих объектов с помощью DataContract и DataMember?
Meidan Alon 15.12.2008 00:45:11
Это странно ... обратите внимание, что в DataMember (по умолчанию) вам необходимо указывать Order для членов, хотя есть глобальный переключатель для определения порядка.
Marc Gravell♦ 15.12.2008 13:27:17

Почему пользовательский Comparer даже нужно сериализовать? Вот тестовый пример, который работает для меня.

используя Систему;
using System.Collections.Generic;
использование System.Runtime.Serialization;
использование System.IO;

открытый класс MyKey {
    публичная строка Name {get; набор; }
    публичная строка Id {get; набор; }
}

открытый класс MyKeyComparer: IEqualityComparer {
    public bool Equals (MyKey x, MyKey y) {
        return x.Id.Equals (y.Id);
    }
    public int GetHashCode (MyKey obj) {
        если (obj == ноль) 
            бросить новый ArgumentNullException ();

        return ((MyKey) obj) .Id.GetHashCode ();
    }
}

открытый класс MyDictionary: Dictionary {
    public MyDictionary ()
        : base (новый MyKeyComparer ())
    {}
}

Программа класса {
    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));

        использование (FileStream writer = new FileStream ("Test.Xml", FileMode.Create))
            ser.WriteObject (writer, myDictionary);

        использование (FileStream reader = новый FileStream ("Test.Xml", FileMode.Open))
            myDictionary = (MyDictionary) ser.ReadObject (reader);
    }
}

0
14.12.2008 19:54:24
Это потому, что ReadObject вызывает ctor MyDictionary. Фактически, сериализуемый мной объект - это не сам словарь, а контейнер из нескольких словарей и еще нескольких объектов. Это ctor не вызывает ctor словарей, но я могу использовать это, спасибо.
Meidan Alon 15.12.2008 00:42:40