私たちは、私たちの製品のバージョン2.0をリリースしており、インストールされているバージョン1.0の顧客とのファイル互換性を維持したいと考えています。私は、アプリケーションのほとんどのタイプでISerializableを実装していますが、問題が発生したようです。私は型を持っているカスタムタイプとシリアライズのリストの問題
は、議論のために家族にそれを呼び出すことができます
[Serializable]
public class Family :
IDisposable,
INotifyPropertyChanged
{
private string m_Address;
//....
private List<Name> m_People;
//...
}
これは、我々が効果的に同じである人物に名前クラスを変更し2.0で、バージョン1.0として出荷されたものですわずかに異なるコンストラクタと、明らかに異なる名前を持っています。
[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>>
}
これは明らかに動作しません、タイプ「名前」はアセンブリでなくなったので、私はそれを修正する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;
}
私はデシリアライズ時にこれは主に、作品obeject、バインダが呼び出され、正しい型が返されますが、PersonのDeserialization Constructorは決して呼び出されません。何の例外も投げられていない、誰もがアイデアを持っている?