3

custom を持つ Dictionary をシリアル化したいIEqualityComparer

使用してみましDataContractSerializerたが、シリアル化できませんComparer

このBinaryFormatterため使えません。

私はいつでも次のようなことができます:

var myDictionary = new MyDictionary(deserializedDictionary, myComparer);

しかし、それは、辞書が使用するメモリの 2 倍が必要になることを意味します。

4

2 に答える 2

0

エラーレポートを読んだだけです...

~1320 万を超えるオブジェクトを含むオブジェクト グラフでは、バイナリ シリアル化が失敗します。

それほど大きなグラフがある場合、常にいくつかの問題が発生する可能性があります。

別のシリアライザーを試してみませんか? 「protobuf-net」は、Google のプロトコル バッファ形式に準拠した特注のバイナリ シリアライザーであり、特に「グループ」モードでは、より大きなセットで機能する可能性があります。

于 2008-12-14T15:52:59.250 に答える
0

カスタム Comparer をシリアル化する必要があるのはなぜですか? ここに私のために働くテストケースがあります。

システムを使用する;
System.Collections.Generic の使用;
System.Runtime.Serialization の使用;
System.IO の使用;

公開クラス MyKey {
    パブリック文字列の名前 {get; 設定; }
    パブリック文字列 ID { get; 設定; }
}

public class MyKeyComparer :IEqualityComparer {
    public bool Equals( MyKey x, MyKey y ) {
        return x.Id.Equals( y.Id ) ;
    }
    public int GetHashCode( MyKey obj ) {
        if( オブジェクト == null )
            新しい ArgumentNullException() をスローします。

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

パブリック クラス MyDictionary :Dictionary {
    パブリック MyDictionary()
        :base( 新しい MyKeyComparer() )
    {}
}

クラス プログラム {
    static void Main( string[] args ) {
        var myDictionary = 新しい 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( ライター, myDictionary );

        using( FileStream リーダー = new FileStream( "Test.Xml", FileMode.Open ) )
            myDictionary = (MyDictionary)ser.ReadObject( リーダー );
    }
}

于 2008-12-14T19:54:24.520 に答える