この質問ごとに、シリアル化するオブジェクトがありますBinaryFormatter
。さまざまな理由から、古いバージョンではなく新しいバージョンにあるフィールドの下部に try-catch ブロックを配置して、このような貧弱なバージョン処理を実装しました。
private void readData(FileStream fs, SymmetricAlgorithm dataKey)
{
CryptoStream cs = null;
try
{
cs = new CryptoStream(fs, dataKey.CreateDecryptor(),
CryptoStreamMode.Read);
BinaryFormatter bf = new BinaryFormatter();
string string1 = (string)bf.Deserialize(cs);
// do stuff with string1
bool bool1 = (bool)bf.Deserialize(cs);
// do stuff with bool1
ushort ushort1 = (ushort)bf.Deserialize(cs);
// do stuff with ushort1
// etc. etc. ...
// this field was added later, so it may not be present
// in the serialized binary data. Check for it, and if
// it's not there, do some default behavior
NewStuffIncludedRecently newStuff = null;
try
{
newStuff = (NewStuffIncludedRecently)bf.Deserialize(cs);
}
catch
{
newStuff = null;
}
_newStuff = newStuff != null ?
new NewStuffIncludedRecently(newStuff) :
new NewStuffIncludedRecently();
}
catch (Exception e)
{
// ...
}
finally
{
// ...
}
}
私は自分のマシンでコードを実行しましたが、これはうまくいくようです。古いシリアル化されたオブジェクトを読み取ると、最も内側の try-catch が、要求に応じて欠落している部分を処理します。
同僚のマシンに行って古いバージョンのオブジェクトを読み込もうとすると、一番上にある最初の Deserialize() 呼び出しで SerializationException がスローされます。
バイナリ ストリーム '220' には、有効な BinaryHeader が含まれていません。考えられる原因は、無効なストリームまたはシリアル化と逆シリアル化の間のオブジェクト バージョンの変更です。
したがって、私の質問:オブジェクトのバージョンが変更される原因は何ですか? オブジェクトの 2 つのバージョン間で自分のボックスを行ったり来たり (新しいフィールドのコメント化/コメント解除) しても問題はありませんが、別の人のボックスでは最初の Deserialize() が爆発します。次のようにバージョンチェックをより寛容にしようとしましたが、どこから始めればよいかさえわかりません。
bf.AssemblyFormat =
System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;