Когда я переименую класс, я получаю ошибку десериализации. Как это исправить? - PullRequest
4 голосов
/ 02 апреля 2010

Я переименовал класс classBattle в Game и не получаю «Невозможно загрузить тип battle.classBattle + udtCartesian, необходимый для десериализации.»

Это строка кода MapSize = (Game.udtCartesian)formatter.Deserialize(fs);

Как мне это исправить? Значит ли это, что я не могу переименовать классы?

Ответы [ 4 ]

4 голосов
/ 02 апреля 2010

BinaryFormatter хрупкий и не предназначен для дружелюбия , если у вас есть изменения в задействованных типах . Если вы хотите такой тип поведения, вам нужен сериализатор на основе контракта, такой как XmlSerializer, DataContractSerializer или protobuf-net. Все, кроме BinaryFormatter.

4 голосов
/ 05 мая 2010

Вы также можете использовать SerializationBinder, чтобы определить, какой тип будет загружен в случае десериализации другого типа:

public sealed class Version1ToVersion2DeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type typeToDeserialize = null;

        if (typeName == "OldClassName")
            typeName = "NewClassName";

        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                                            typeName, assemblyName));

        return typeToDeserialize;
    }
}

Для десериализации, вам просто нужно установить свойство Binder BinaryFormatter:

formatter.Binder = new Version1ToVersion2DeserializationBinder();
NewClassName obj = (NewClassName)formatter.Deserialize(fs);
1 голос
/ 02 апреля 2010

При сериализации, если не используются контракты, имя класса является его частью, поэтому очевидно, что для десериализации имя класса должно быть таким же.

Вы можете изменить имя класса, снова сериализовать и десериализовать без проблем.

Что не сработает, так это сериализация с одним именем и попытка десериализации обратно с другим именем.

Кроме этого, используйте контракты и форматер, который их использует.

0 голосов
/ 05 ноября 2011

Если вас не интересуют сохраненные данные, просто удалите файл, новый будет сохранен с новым именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...