По существу, BinaryFormatter
не является переносимым ; был разработан для удаленного взаимодействия между двумя узлами, выполняющими идентичный код, а не для сохранения данных между платформами. Итак: мой основной совет прост:
Не используйте BinaryFormatter
. Когда-либо.
Я понимаю, что эта лодка, возможно, отплыла, но очень прагматичный вариант:
- выбрать новый сериализатор - убедиться, что он переносной (json, xml), protobuf и т. д.);примерно всего, кроме
BinaryFormatter
- в вашем старом коде, десериализовать данные с вашим текущим кодом и сериализовать их отдельно с новым выбором сериализатора
- в вашемновый код, десериализовать его только в новом формате
При push , однако, вы можете попробовать поиграть с пользовательским SerializationBinder
;Идея в том, что вы создаете подкласс SerializationBinder
, переопределяете методы и сообщаете ему, где что-то найти. Основная проблема здесь заключается в том, что:
- сборки (mscorlib и т. Д.) Изменили идентичность
- типы перемещаются между сборками во многих случаях
Обе эти проблемы требуют решения.
Частичный код:
var bf = new BinaryFormatter { Binder = MyBinder.Instance };
// etc
с
class MyBinder : SerializationBinder
{
private MyBinder() { }
public static MyBinder Instance { get; } = new MyBinder();
public override Type BindToType(string assemblyName, string typeName)
{
// TODO: check assemblyName and typeName against some known list, and
// return the Type that should be used, often *instead of* the
// one it expected;
}
public override void BindToName(Type serializedType,
out string assemblyName, out string typeName)
{
//TODO: the opposite
}
}
Но это тяжелая работа, и нелепо хрупкие. Ваше время было бы намного лучше потрачено на портирование на другой сериализатор, IMO. С удовольствием порекомендую некоторые из них, в зависимости от ваших потребностей.
Примечание: они неоднократно пытались убить BinaryFormatter
для .NET Core, но, к сожалению, выжили.