2014-09-04 51 views
1

我在桌面WPF應用程序中使用Catel框架,當我嘗試將模型保存到文件時出現以下錯誤。類型<Type>與數據合同名稱<合同名稱>不是預期

Type 'GeoChemicalFuncsCS.Core.Models.BoilingModel' with data contract name 'BoilingModel:http://schemas.datacontract.org/2004/07/GeoChemicalFuncsCS.Core.Models' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. 

我嘗試添加了KnownType和ServiceKnownType標籤的模型,但我得到:

KnownType could not be found. 

ServiceKnownType could not be found. 

而且我也試過WarmingUp的SerializationFactory在視圖模型:

var typesToWarmup = new Type[] { typeof(BoilingModel) }; 
SerializationFactory.GetXmlSerializer().Warmup(typesToWarmup); 

但沒有改變。

有沒有人有任何建議?我現在可以做什麼?

謝謝 Saul Hidalgo。

+0

現在我明白了。你根本沒有使用WCF。忘記我之前發佈的內容。 什麼是SerializationFactory?似乎並不是.NET框架的一部分,但似乎它試圖使用WCF serializaton機制,這可能不是你所需要的。對於對象的簡單XML序列化,您應該使用'System.Xml.Serialization.XmlSerializer'。 – chris 2014-09-04 09:48:43

+0

您是否使用最新的預發佈?我們在序列化引擎上對Catel 4.0(即將發佈的版本)進行了數字改進。 – 2014-09-04 10:03:01

+0

嗨Geert Van Horrik。 我想更新到Catel 4.0,但我還沒有完成。但是,我認爲這與我如何序列化我的對象有關。我這樣說是因爲我也試圖在不使用Catel的情況下序列化,而且我也有同樣的錯誤。我的代碼是: 'XmlSerializer Serializer = new XmlSerializer(typeof(MainWindowModel)); Serializer.Serialize(File.Create(AlcatrazSPCALC.Models.Constants.SaveFilePath),MainWindowModel);' 我的模型裏面有其他模型。你推薦我什麼? 而關於Catel 4.0。你建議我們使用它嗎?它足夠穩定嗎? – 2014-09-04 19:58:15

回答

0

經過一番工作,我終於解決了這個問題。

問題是由於我有一個包含2種類型的對象(都可序列化)的集合。我試圖概括它創建一個「對象」的集合,當我需要使用它時,我將它鑄造出來。

那麼,序列化引擎發現類型「對象」,當他試圖序列化時,他發現它確實是一個BoilingModel。

解決方案只是在做一個接口,現在這兩種可串行化類型都實現了該接口。

我希望它可以幫助其他人解決同樣的問題。

Registers Saul。

0

它看起來像你(或Catel庫)以某種方式嘗試使用WCF DataContractSerializer將簡單對象簡單序列化爲XML文件。這不是DataContractSerializer的設計目的 - 它基本上是設計用於將數據對象序列化爲通過WCF Web服務發送的SOAP,並且需要複雜的配置。

對於簡單的XML序列化,請註釋要與[Serializable]序列化的類/結構並使用System.Xml.Serialization.XmlSerializer

例(未測試):

var boilingModelObj = new BoilingModel(); 
// ... fill object with data ... 
var serializer = new XmlSerializer(typeof(BoilingModel)); 
using (var writer = new StreamWriter("boilingmodel.xml")) 
{ 
    serializer.Serialize(writer, boilingModelObj); 
} 
+0

模型不是「普通對象」,它都是動態的。 – 2014-09-04 14:02:49

相關問題