我有一个传统的应用程序,它使用SoapFormatter来坚持对象的图形(可能是50个不同的类)。我不想使用它,因为它已被弃用,并且越来越难以继续支持随着类更改而从旧文件反序列化。我该如何替换已弃用的SoapFormatter?
我想继续使用DataContractSerializer。有没有人有任何关于迁移的好策略的建议?我需要继续能够通过反序列化写SoapFormatter旧文件...
感谢
我有一个传统的应用程序,它使用SoapFormatter来坚持对象的图形(可能是50个不同的类)。我不想使用它,因为它已被弃用,并且越来越难以继续支持随着类更改而从旧文件反序列化。我该如何替换已弃用的SoapFormatter?
我想继续使用DataContractSerializer。有没有人有任何关于迁移的好策略的建议?我需要继续能够通过反序列化写SoapFormatter旧文件...
感谢
我不认为要限制在向后兼容的格式。
所以你需要区分新旧内容。而简单的方法是:
旧格式:<soapdata>
新格式:<header> <newdata>
,并在新的Load()方法:
最简单的代码是尝试使用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的到understant的SoapFormatter结构,但你将不得不提供更多的工作。
谢谢 - 我知道我需要区分旧格式和新格式。 我在想如何改变类,以便我可以使用新的DCS继续前进,同时仍然能够将旧的SoapFormatter持久数据加载到它们中。 我的一个想法是创建旧类的重复项,并使用反射来将数据逐字段复制到新类的实例中。这样我可以自由删除新类中的字段等。 – peon 2010-09-03 13:25:53