2013-12-10 70 views
3

我們的一個WCF服務的方法拋出異常,對生產環境:DataContractSerializer.MaxItemsInObjectGraph屬性的含義

The formatter threw an exception while trying to deserialize the message: There was an
error while trying to deserialize parameter http: //our_schema:GetSomeListResult. The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'. Change the object graph or increase the MaxItemsInObjectGraph quota.

GetSomeList返回對象列表的方法(15個性質 - 整型,枚舉,字符串,DateTime是否)它有大約6k元素。但是,相同的服務配置不會導致我的本地機器和測試環境發生此錯誤。 我知道如何解決這個錯誤:

<behavior name="basicEndpointBehavior"> 
    <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 

,但我不明白它的性質。

那麼什麼是序列化/反序列化數組中的對象的實數? List.Count? List.Count *(屬性數量)?如果公式爲List.Count *(屬性數量),對象數量= 6k * 15 = 90k,這大於65536.爲什麼此方法調用本地調用大小相同的數組?

+0

那麼你可以在本地點擊相同的數據而不會出錯?你確定你的配置在本地和生產中是一樣的嗎? –

回答

2

這是對象的數量 - 即需要序列化的事件的實例的數量。如果列表中所有對象的屬性只返回一個原始對象,則編號應爲List.Count * (number of properties + 1)(列表中的每個項目是一個對象,並且項目的每個屬性都是另一個)。

如果您將EmitDefaultValue設置爲false,則該數字可能會顯着降低,但機率不是這樣。至於爲什麼行爲可能在本地和生產上有所不同,我已經看到串行器配置僅適用於HTTP的情況,並且您必須爲HTTPS單獨設置它;這可能是問題嗎?