FormatterAssemblyStyle.Full を使用したバイナリ フォーマッタのアセンブリ形式を使用して、逆シリアル化を "中断" する方法を知りたいです。
ドキュメントには、これについて次のように記載されています。
完全モードでは、逆シリアル化中に使用されるアセンブリは、シリアル化中に使用されるアセンブリと正確に一致する必要があります。
アセンブリのバージョン 1.0.0.0 でオブジェクト (値型フィールドを持つ単純なクラスである _person) をシリアル化すると、アセンブリの v1.2.0.0 (AssemblyInfo.cs を更新) で逆シリアル化を試みると思いました。逆シリアル化の例外が発生します。ただし、正常に逆シリアル化されます。
何か不足していますか?
以下を使用してファイルにシリアル化しています。
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
using (Stream stream = new FileStream(fileName,
FileMode.Create,
FileAccess.Write,
FileShare.None))
{
formatter.Serialize(stream, _person);
stream.Close();
}
次に、次を使用して逆シリアル化します。
BinaryFormatter formatter = new BinaryFormatter();
formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
_person = (Person)formatter.Deserialize(stream);
stream.Close();
}
また、FormatterAssemblyStyle.Full と FormatterAssemblyStyle.Simple を使用して生成されたシリアル化されたファイルには、両方とも完全なバージョン情報が含まれていることに気付きました (たとえば、バージョン 1.0.0.0 Culture = ニュートラル、PublicKeyToken = null) - Simple はこの情報をすべて追加しないと思いましたか? (こののフォーマッターとアセンブリ名のセクションを参照してください)
更新 1:
これまでに見た唯一の違いは、Simple を使用する場合、古いバージョンを正常に逆シリアル化するために、シリアル化されたクラスの新しいフィールドに属性を配置する必要がないことです。OptionalField
Full を使用すると、OptionalField
属性を新しいフィールドに配置しない限り、例外がスローされます。厳密な名前が付いていないアセンブリを使用する場合、これが唯一の違いですか??
詳しくはこちらをご覧ください。
前もって感謝します