首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何替换已弃用的SoapFormatter?

如何替换已弃用的SoapFormatter?
EN

Stack Overflow用户
提问于 2010-09-02 23:53:50
回答 2查看 596关注 0票数 1

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

我想继续使用DataContractSerializer。对于一个好的迁移策略,有人有什么建议吗?我需要继续对SoapFormatter编写的旧文件进行反序列化...

谢谢

EN

回答 2

Stack Overflow用户

发布于 2010-09-03 00:08:50

我不认为你想被限制在一个向后兼容的格式。

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

旧格式:<soapdata>

新格式:<header> <newdata>

在新的Load()方法中:

  1. (Try to) read the header
  2. 如果找到标题,请继续读取新的格式
  3. ,否则请重新定位以开始并使用SOAP格式化程序读取。
票数 1
EN

Stack Overflow用户

发布于 2011-01-06 17:25:10

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

代码语言:javascript
复制
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结构,但是您必须提供更多的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3628843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档