Проблема управления версиями SoapFormatter - PullRequest
1 голос
/ 01 мая 2009

В поддерживаемом приложении (C #) в базе данных хранится несколько сериализованных объектов, а некоторые создаются несколько версий назад.

Теперь, когда приложение пытается десериализовать эти объекты, оно выдает исключение: Ошибка разбора, сборка не связана с ключом Xml .... (имя и версия сборки)

Насколько я понимаю, когда SoapFormatter пытается десериализовать объект, он сначала проверяет, совпадает ли десериализованная сборка с сериализованной сборкой, и если нет, то выдает вышеуказанное сообщение об ошибке. Будет ли это так?

Если это так, есть ли способ преобразовать эти старые данные, чтобы сделать их читаемыми в самой последней версии приложения?

Кстати, я думаю о том, чтобы написать программу с тем же именем сборки и версией, которая будет представлять собой ту же сборку, что и сериализованные объекты. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 01 мая 2009

Я не пробовал этого, но мне интересно, могли бы вы использовать XSLT для преобразования более старой версии в более новую структуру "версии".

0 голосов
/ 09 мая 2009

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

В итоге я просто использовал Regex.Replace для преобразования измененных имен сборок и имен элементов в что-то вроде этого:

newData = Regex.Replace(textData, "(" + String.Join("|", keys) + ")",
                        new MatchEvaluator(this.EvaluateReplacement));

string EvaluateReplacement(Match m)
{
    if (this.convertDict.ContainsKey(m.Value))
    {
        return this.convertDict[m.Value];
    }
    return m.Value;
}

где this.convertDict - это объект Dictionary, который содержит преобразования преобразования.

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