【问题标题】:SoapFormatter versioning problemSoapFormatter 版本控制问题
【发布时间】:2009-04-30 23:10:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# soap serialization soap-serialization


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,但序列化的对象不是 XML,而是某种二进制数据,例如“PFNPQVAtRU5WOkVudmVsb3BlIHhtbG5zOnhzaT0iaHR0cDovL3d3d....”
    • 我刚刚意识到它只是一个从存储 xml 的内存流转换而来的字符串。所以现在我可以将该字符串转换回 XML。我会接受你的建议,谢谢乔丹!
    【解决方案2】:

    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 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多