如何替换已弃用的SoapFormatter?

时间:2010-09-02 15:53:50

标签: c# .net xml serialization

我有一个遗留应用程序,它使用SoapFormatter来持久化对象图(可能是50个不同的类)。我希望不再使用它,因为它已被弃用,并且越来越难以继续支持在类更改时从旧文件反序列化。

我想继续使用DataContractSerializer。有没有人对移植的良好策略有任何建议?我需要继续能够反序列化由SoapFormatter编写的旧文件...

由于

2 个答案:

答案 0 :(得分:1)

我认为您不希望仅限于向后兼容的格式。

因此,您需要区分新旧内容。简单的方法是:

旧格式:<soapdata>
新格式:<header> <newdata>

在你的新Load()方法中:

  1. (尝试)阅读标题
  2. 如果找到标题,请继续阅读新格式
  3. else重新开始并使用SOAP格式化程序来阅读。

答案 1 :(得分:0)

最简单的代码是尝试使用DataContractSerializer进行反序列化,如果失败则回退到SoapFormatter。 保存部分将始终使用DataContractSerializer,以便您的新对象或更新的对象将使用您新支持的版本。

public MyContract Deserialize(string file)
{
  try
  {
    using (var stream = loadFile())
    {
      return loadWithDataContractSerializer(stream);
    }
  }
  catch (SerializationException)
  {
    using (var stream = openForRead(file))
    {
      return convertToContract(loadWithSoapFormatter(stream));
    }
  }
}

private MyContract loadWithDataContractSerializer(Stream s);
private MyOldObject loadWithSoapFormatter(Stream s);
private MyContract convertToContract(MyOldObject obj);

public void Serialize(string file, MyContract data)
{
  using (var stream = openForWrite(file))
  {
    writeWithDataContractSerializer(stream, data);
  }
}

当然,也许可以实现自定义逻辑以允许DataContractSerializer理解SoapFormatter结构,但是你必须提供更多的工作。