我有一個傳統的應用程序,它使用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