2

いずれかの製品のバージョン2.0のリリースに取り組んでおり、バージョン1.0のお客様のインストールベースとのファイル互換性を維持したいと考えています。私はアプリケーションのほとんどのタイプにISerializableを実装してきましたが、問題が発生したようです。

私はタイプを持っています、議論のためにそれをファミリーと呼びましょう

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged
{
    private string m_Address;
    //....
    private List<Name> m_People;
    //...
}

これはバージョン1.0として出荷されたものであり、2.0ではNameクラスをPersonに変更しました。これは事実上同じですが、コンストラクターがわずかに異なり、明らかに名前が異なります。

[Serializable]
public class Family : 
    IDisposable,
    INotifyPropertyChanged,
    ISerializabe
{
    private string m_Address;
    //....
    private List<Person> m_People;
    //...

    private Family(SerializationInfo info, StreamingContext context)
    {
        m_Address = info.GetString("m_Address");
        m_People = (List<Person>)info.GetValue("m_People", typeof(List<Person>));
    }

    // <<GetObjectData Method>>
}

これは明らかに機能しません。タイプ"Name"はアセンブリに存在しないため、SerializationBinderを追加して修正しました。

public sealed NamePersonSerializationBinder : SerializationBinder
{
    if (typeName.StartsWith("System.Collections.Generic.List`1[[Company.Name"))
        return typeof(List<Person>);
    else if (typeName.StartsWith("Company.Name"))
        return typeof(Person);
    else
        return null;
}

これは主に機能します。オブジェクトを逆シリアル化すると、バインダーが呼び出され、正しい型が返されますが、Personの逆シリアル化コンストラクターが呼び出されることはありません。例外はスローされていません、誰かが何かアイデアがありますか?

4

1 に答える 1

0

修理済み!コンストラクターを終了できなかった基本タイプのPersonがあり、これにより、personコンストラクターが呼び出されることはありませんでした。

于 2011-01-04T19:22:06.250 に答える