За этот вопрос У меня есть объект, который я сериализую с 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
{
// ...
}
}
Я шагнулчерез код на моей машине, и это, кажется, работает.Когда я читаю старый сериализованный объект, внутренняя попытка перехвата обрабатывает недостающую часть, как я и просил.
Когда я иду на компьютер коллеги, чтобы попытаться прочитать старую версию объекта, возникает исключение SerializationExceptionгенерируется при первом вызове Deserialize () сверху:
Двоичный поток '220' не содержит допустимого BinaryHeader.Возможные причины - неверное изменение потока или версии объекта между сериализацией и десериализацией.
Отсюда мой вопрос: что вызывает изменение версии объекта?Когда я перемещаюсь по своему ящику между двумя версиями объекта (комментируя / раскомментируя новые поля), проблем нет, но на ящике другого человека первые бомбы Deserialize ().Я даже не уверен, с чего начать, хотя я пытался сделать проверку версий более разрешительной, например:
bf.AssemblyFormat =
System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;