4

我試圖序列化一個對象,並以下SerializationException拋出:這個不可序列化的對象在哪裏?

類型「System.Linq.Enumerable + d__71`1 [System.String,mscorlib程序,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089]]'在大會'System.Core,版本= 4.0.0.0,文化=中立,PublicKeyToken = b77a5c561934e089'未標記爲可序列化。

此代碼在我的代碼中位於何處?我如何知道?對象圖很大。

+0

怎麼樣的堆棧跟蹤? – 2011-03-16 02:34:35

+1

其簡單的序列化堆棧...沒有關於無法序列化的對象 – SFun28 2011-03-16 03:41:57

回答

4

嘗試使用Reflector,看看您是否可以確定代碼中使用匿名類型d__71`1的位置。

+1

謝謝!我甚至沒有想過要將我的dll加載到反射器中。一旦我做了,很容易找到d__71'1並分析它的用法。謝謝! – SFun28 2011-03-16 03:45:15

-1

嘗試一次序列化一個對象(單一類型)並查看它何時爆炸。您可以手動或通過反射來完成此操作。

+0

那麼 - 爲什麼downvote?這正是我如何解決問題(我有一個很好的感覺,它會工作)。 – RQDQ 2011-03-16 12:14:01

4

聽起來對我來說就好像你已經存儲了調用枚舉器方法的結果而不會將結果轉換爲列表。

當你有這樣的方法:

public IEnumerable<string> GetMyWidgetNames() 
{ 
    foreach (var x in MyWidgets) 
    { 
     yield return x.Name; 
    } 
} 

編譯器變成一個嵌套的對象這跟喜歡你所看到的一個(一個名字一個名字,你永遠無法創建自己因嵌入式+

如果您然後將某個對象的引用存儲在您嘗試序列化的某個對象中,那麼您將得到由OP指出的異常。

「修復」是爲了確保序列化對象始終將任何IEnumerable指派轉換爲列表。取而代之的是

public IEnumerable<string> WidgetNames { get; set; } 

你需要寫:

public IEnumerable<string> WidgetNames 
{ 
    get { return mWidgetNames; } 
    set 
    { 
     if (value == null) 
      mWidgetNames= null 
     else mWidgetNames= value.ToList(); 
    } 
} 
private List<string> mWidgetNames; 
+0

+1,System.Linq.Enumerable ...表示這組數據是從Linq查詢返回的。儘管它實現了IEnumerable,但它不是可序列化的。通常你需要在這個Linq結果上調用ToList()或ToArray(),然後它可以被序列化。 – 2011-03-16 03:43:37

+0

這幫了很多。我希望讓我分裂答案。你的答案和@Mark Hurd幫助我追蹤了這個問題。它實際上是一個IEnumerable,它被連接起來並需要將其平鋪到列表中。我翻了一個硬幣給誰答覆。 – SFun28 2011-03-16 03:44:29

相關問題