代码之家  ›  专栏  ›  技术社区  ›  FlyinFish

SoapFormatter版本问题

  •  1
  • FlyinFish  · 技术社区  · 15 年前

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

    现在,当应用程序试图反序列化这些对象时,它抛出一个异常: 分析错误,没有与XML键关联的程序集….(程序集名称和版本)

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

    如果是这样的话,有没有一种方法可以转换这些旧数据,使它们能够被最新版本的应用程序读取?

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jordan S. Jones    15 年前

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

        2
  •  0
  •   FlyinFish    15 年前

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