1

在我正在维护的应用程序(C#)中,有一些序列化的对象存储在数据库中,有些是在几个版本之前创建的。

现在,当应用程序尝试反序列化这些对象时,它会引发异常:解析错误,没有与 Xml 键关联的程序集....(程序集名称和版本)

据我了解,当 SoapFormatter 尝试反序列化对象时,它首先检查反序列化程序集是否与序列化程序集相同,否则将抛出上述错误消息。会是这样吗?

如果是这种情况,有没有办法转换这些旧数据以使它们可以被最新版本的应用程序读取?

在旁注中,我正在考虑编写一个程序以具有相同的程序集名称和版本来假装是序列化这些对象的同一个程序集,这可能吗?

4

2 回答 2

1

我还没有尝试过,但我想知道您是否可以使用 XSLT 将旧版本转换为更新的“版本”结构。

于 2009-04-30T23:31:51.397 回答
0

Jordan 提到的 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 对象。

于 2009-05-08T22:59:46.797 回答