Изменение пространства имен двоичной сериализации - PullRequest
3 голосов
/ 01 марта 2011

Я сериализовал класс, который раньше находился в пространстве имен Temp, но теперь я десериализирую внутри другого пространства имен (я имею в виду класс, который я использую для извлечения объектов, в настоящее время находится в другом пространстве имен). Я сталкиваюсь с ошибкой, что пространство имен Temp не может быть найдено. Я нашел это отображение полезным: Сохранение совместимости сериализованных данных .NET при перемещении классов .

Есть ли способ просто сериализовать объект класса, а не информацию о сборке или информацию о пространстве имен? (Я думаю о будущих изменениях и избавлении от этого отображения).

Ответы [ 3 ]

4 голосов
/ 29 января 2013

Вы можете заставить новый Тип переписать метод в своем собственном Binder. (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder.aspx)

Например, вы можете определить следующий класс:

sealed class MyBinder : SerializationBinder
{
    private readonly Type _type;

    public MyBinder(Type type)
    {
        _type = type;
    }

    public override Type BindToType(string assemblyName, string typeName)
    {
        return _type;
    }
}

и затем установите подшивку в BinaryFormatter

var formatter = new BinaryFormatter();

formatter.Binder = new MyBinder(typeof(YourClass));

using (var stream = new MemoryStream(bytes))
{
    YourClass yourobject = formatter.Deserialize(stream);
}
2 голосов
/ 05 ноября 2011

Когда вы создаете BinaryFormatter для сериализации ваших данных, вы можете установить для свойства AssemblyFormat значение FormatterAssemblyStyle .Simple. Это приведет к тому, что сериализуется только имя сборки, а не полное полное имя сборки полной версии.

Также вы можете использовать SerializationBinder с вашим BinaryFormatter. В .NET 4.0 вы можете предоставить метод BindToName как часть SerializationBinder, который позволяет вам управлять отображением имен пользовательских типов при сериализации.

2 голосов
/ 01 марта 2011

С этим проще всего справиться с событием AppDomain.TypeResolve.

...