Per this question I have an object that I'm serializing with BinaryFormatter
. For various reasons we've implemented a poor man's version handling like this with a try-catch block at the bottom for the fields that are in the newer version but not in the older version:
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
{
// ...
}
}
I stepped through the code on my machine and this seems to work. When I read an old serialized object, the innermost try-catch handles the part that's missing as I ask it to.
When I go to a colleague's machine to try to read an old version of the object, a SerializationException gets thrown at the first Deserialize() call at the top:
Binary stream '220' does not contain a valid BinaryHeader. Possible causes are invalid stream or object version change between serialization and deserialization.
Hence my question: What causes the version of the object to change? When I go back and forth on my box between the two versions of the object (commenting/uncommenting the new fields) there's no problem, but on another person's box the first Deserialize() bombs. I'm not sure even where to start looking, though I did try making the version checking more permissive like so:
bf.AssemblyFormat =
System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;