2009-11-13 79 views
1

我有一個相當複雜的對象模型,我試圖使用WCF序列化。我遇到了一個問題,我可以在服務器上創建一個新實例並將其返回給客戶端,然後嘗試將同一個對象傳回,甚至使用DataContractSerializer序列化它將引發異常。錯誤使用WCF和DataContractSerializer

測試方法Server.Service.Test.SerializationTest.TestFilingSerialization引發異常:System.Runtime.Serialization.SerializationException:對MyNameSpace.MyObject類型的對象進行反序列化時出現錯誤。沒有設置屬性''類型''的方法

它沒有給我任何關於二傳手的信息我被認爲是失蹤了,儘管我已經試過尋找遺漏的二傳手的繼承層次結構,但是我不能似乎通過了這一點。 MyObject是我試圖序列化的對象上的一種屬性,這裏是有趣的部分。在二傳手該財產,我有一些代碼,看起來像這樣:

set 
{ 
    _backingField = value; 
    _backingField.IsDirtyManager.SetIsDirty(); 
    NotifyPropertyChanged("MyProperty"); 
    if (!ContainsType(_backingField.GetType())) 
    { 
     Aggregates.Add(_backingField); 
    } 
} 

如果我註釋掉Aggregates.Add它進入到下一個屬性,並拋出了同樣的異常那裏,踢球的是,它得到的經過其他屬性使用相同的代碼,在它遇到這個並且死亡之前,所以我不知道這個問題會是什麼。

任何人都會遇到真正的錯誤,因爲屬性名稱和類型沒有填寫在異常中,所以它看起來像錯誤必須是別的東西。如果我只是在客戶端上創建一個新實例,我可以反序列化和序列化沒有問題,所以這裏有一些我在這裏丟失的東西。任何想法尋找什麼?

編輯

我從字面上做只有這個:

  1. 創建實例
  2. 序列化
  3. 反序列
  4. 重新序列
    1. 死在這裏
+0

因此,在序列化過程中,客戶端會發生這種情況嗎? – scmccart 2009-11-13 20:41:39

+0

是的,完全跳過WCF,這就是發生了什麼,這是一個序列化問題。 – Nick 2009-11-13 21:04:41

回答

1

好吧,算出來。最後一位開發人員在DataMember屬性上設置了Order屬性。它是錯誤消息中導致問題的屬性之前的屬性。我在課堂上錯過了一些只讀屬性。

+0

您可以將此添加到說明並表明它已解決?這對於像我這樣的人來找這個答案是有幫助的。另外,我發佈了這裏(http://endlessobsession.com/2010/07/12/datacontractserializer-serialization-error/)關於相同的問題,並描述了一個稍微不同的情況。 – 2010-07-13 01:02:40

1

我假設「聚合」是你的班級中的一個列表。

如果您的類構造函數未創建聚合列表,那麼當您嘗試向其中添加項目時,它爲空。

這與您正在收到的錯誤不符,但值得檢查。

編輯

在Visual Studio中進入 「工具」 - > 「選項」 - > 「調試」 - > 「常規」 取消對 「啓用僅我的代碼」。然後再次運行它,您可能會收到更好的錯誤消息。

+0

它不爲空,我甚至嘗試添加一個OnDeserialized方法,它會被調用來檢查這些東西 – Nick 2009-11-13 20:19:40

+0

要除去任何額外的變量,我有一個單元測試,它創建一個新實例並直接使用DataContractSerializer來序列化,反序列化和重新序列。第三步是死亡。我確定這個東西里面發生了一些事情,或者是一個搞砸了它的setter。但我需要找出在哪裏。 – Nick 2009-11-13 20:57:52

+0

我的確遇到了不同的錯誤,請參閱編輯的問題。 – Nick 2009-11-13 20:58:36

0

如果你的setter是受保護的或私人的,你可能會看到這個。如果未標記爲公共,串行器將無法設置它。你如何讓你的Aggregates集合被暴露?

+0

聚合是一個公開名單。這發生在序列化上,我將它追蹤到它從屬性返回對象然後撲滅的地步。如果我嘗試序列化只是該屬性,它工作正常。 – Nick 2009-11-16 20:05:48