3

以前は名前空間 Temp にあったクラスをシリアル化しましたが、現在は別の名前空間内で逆シリアル化しています (オブジェクトを取得するために使用するクラスが現在別の名前空間に存在することを意味します)。Temp 名前空間が見つからないというエラーに直面しています。このマッピングが役立つことがわかりました: クラスを移動するときに .NET シリアル化されたデータの互換性を維持します

アセンブリ情報や名前空間情報ではなく、クラス オブジェクトをシリアル化する方法はありますか? (私は将来の変更を考えており、そのマッピングを取り除きます)。

4

3 に答える 3

4

新しい Type が独自の Binder でメソッドを強制的に書き換えることができます。( http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx )

たとえば、次のクラスを定義できます。

sealed class MyBinder : SerializationBinder
{
    private readonly Type _type;

    public MyBinder(Type type)
    {
        _type = type;
    }

    public override Type BindToType(string assemblyName, string typeName)
    {
        return _type;
    }
}

BinaryFormatter でバインダーを設定します。

var formatter = new BinaryFormatter();

formatter.Binder = new MyBinder(typeof(YourClass));

using (var stream = new MemoryStream(bytes))
{
    YourClass yourobject = formatter.Deserialize(stream);
}
于 2013-01-28T20:54:28.093 に答える
2

これを処理する最も簡単な方法は、AppDomain.TypeResolveイベントを使用することです。

于 2011-03-01T09:33:33.580 に答える
2

を作成しBinaryFormatterてデータをシリアル化する場合、AssemblyFormatプロパティをFormatterAssemblyStyle.Simple に設定できます。これにより、バージョン修飾された完全なアセンブリ名ではなく、アセンブリ名のみがシリアル化されます。

また、 を とともに使用することもできSerializationBinderますBinaryFormatter。.NET 4.0 では、シリアライズ時にカスタム型名マッピングを制御できるBindToNameメソッドを の一部として提供できます。SerializationBinder

于 2011-11-04T23:58:30.540 に答える