Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SoapFormatter版本控制问题_C#_Soap_Serialization_Soap Serialization - Fatal编程技术网

C# SoapFormatter版本控制问题

C# SoapFormatter版本控制问题,c#,soap,serialization,soap-serialization,C#,Soap,Serialization,Soap Serialization,在我维护的应用程序(C#)中,有一些序列化对象存储在数据库中,还有一些是在几个版本之前创建的 现在,当应用程序尝试反序列化这些对象时,会引发异常: 分析错误,没有与Xml键关联的程序集。。。。(程序集名称和版本) 据我所知,当SoapFormatter尝试反序列化对象时,它首先检查反序列化程序集是否与序列化程序集相同,如果不是,它将抛出上述错误消息。会是这样吗 如果是这样的话,有没有办法将这些旧数据转换为最新版本的应用程序可读的数据 另一方面,我正在考虑编写一个程序,使其具有相同的程序集名称和版

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

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

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

如果是这样的话,有没有办法将这些旧数据转换为最新版本的应用程序可读的数据


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

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

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

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是包含转换映射的字典对象

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是包含转换映射的字典对象

感谢您的回复,但是序列化对象不是XML,而是某种二进制数据,比如“pfnpqvatru5wokvudmvsb3blihhtbg5zonhzat0kiahr0cdovl3d3d…”我刚刚意识到它只是一个从存储XML的内存流转换而来的字符串。现在我可以将该字符串转换回XML。我会试试你的建议,谢谢乔丹!感谢您的回复,但是序列化对象不是XML,而是某种二进制数据,比如“pfnpqvatru5wokvudmvsb3blihhtbg5zonhzat0kiahr0cdovl3d3d…”我刚刚意识到它只是一个从存储XML的内存流转换而来的字符串。现在我可以将该字符串转换回XML。我会试试你的建议,谢谢乔丹!