Согласно этой публикации, Changing a namespace causes errors when using "BinaryFormatter.Deserialize" to reload object data saved while defined under a different namesapce(sic), вы должны посмотреть на класс SerializationBinder.
Тем не менее, я настоятельно призываю вас найти другой способ обработки ваших данных, поскольку бинарный форматтер предназначен для использования в качестве недолговечного обработчика транспортной упаковки, а не для обработчика хранилища.
Вы посмотрели protocol buffers, в качестве примера?
Edit: Хорошо, прочитав ваш комментарий, и перечитывая свой вопрос, оказывается, ваш вопрос не имеет ничего общего с сериализации в конце концов, двоичный или иным образом.
Проблема, по-видимому, состоит в том, что вы сериализовали класс типа A и попытались десериализовать его или отбросить его после десериализации на тип B другого типа.
Это, конечно, не работает прямо из коробки, и может быть легко воспроизведена без введения сериализации на всех, вы просто сделать это:
public class A { ... } <-- a class with some properties and stuff
public class B { ... } <-- another class, with the same properties and stuff
public void Test()
{
A a = new A();
B b = a; <-- you get the same problem as in your code here
}
Есть много способов справиться с этим. Например, вы можете внедрять операторы литья в один из классов, что позволит сделать вышеуказанный код.
Вы можете реализовать метод типа «клонирование», который принимает объект типа A, создает новый объект типа B и копирует все свойства и прочее.
Обратите внимание, что сериализация XML использует тип, который вы указываете ему как свой корневой тип, что означает, что вы можете сериализовать объект типа A и десериализовать его как объект типа B, если вы даете B только объекту сериализации когда вы намереваетесь десериализовать, и при условии, что у этого типа достаточно метаданных, чтобы они выглядели как объект типа A.
У меня есть контрольный вопрос, который может дать нам некоторое представление о том, почему вы пытаетесь сделайте это: почему вы не можете десериализовать его как оригинальный тип и оставить его на этом? Почему вы должны его бросить?
Это похоже на то, что «две машины одинаковы, кроме одного красного, другого синего, а один из них - брод, а другой - volvo»? –
Это больше похоже на то, что один из красных Volvos был продан дилером A, а другой красный Volvo был продан дилером B, поэтому они «разные». – user20493
Не совсем, @alankdkd. Пространство имен является частью имени класса, @Lesse является правильным. –