2008-10-08 154 views
3

的情況是這樣的:主營項目A.和類庫B. A引用乙序列化問題

項目B具有將被序列化的類。這些類在A中使用。現在,問題出現在來自項目A的時候,我嘗試從B序列化對象。拋出一個異常,說A中的類不能被序列化。這是奇怪的部分,因爲在B的類中我不能引用A中的那些(將創建循環依賴)。

我該如何追蹤問題?因爲異常方法沒有說出問題出現在哪裏?

編輯: 好吧,我發現的肯特Boogaart的小的應用程序的幫助下,問題:d。我在項目A的類中有一個PropertyChanged監聽器,它沒有標記爲可序列化 - 我不想標記它。 (它會將該類序列化爲正確的?)

我已通過以下鏈接解決了該事件的問題:.NET 2.0 solution to serialization of objects that raise events。 仍然有一個問題,但它可能類似。

PS:偉大的工具,從肯特Boogaart

+0

你在一個項目一個WebService做什麼? – ullmark 2008-10-08 10:41:55

+0

請發佈例外消息。 – FantaMango77 2008-10-08 10:42:28

回答

8

我已經寫了一個名爲sertool的工具,它會告訴您什麼在您的對象圖不能被序列化以及它如何被引用。

1

也許從B您的目標是從使用類/接口不屬於A或B的一部分存儲對象的引用,例如,如果B使用對象(System.Object)從A存儲對象參考

2

您將首先需要將問題隔離到特定的類。然後你可以實現自定義序列化並進行調試以找到真正的問題。

只是一個簡單的實現,讓你完成這個過程步驟:

using System; 
using System.Runtime.Serialization; 
using System.Security.Permissions; 

[Serializable] 
public class Test : ISerializable 
{ 
    private Test(SerializationInfo info, StreamingContext context) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test)); 

     foreach (SerializationEntry entry in info) 
     { 
      PropertyDescriptor property = properties.Find(entry.Name, false); 
      property.SetValue(this, entry.Value); 
     } 
    } 

    [SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)] 
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test)); 

     foreach (PropertyDescriptor property in properties) 
     { 
      info.AddValue(property.Name, property.GetValue(this)); 
     } 
    } 
} 

肯特的工具看起來也很漂亮,並且將毫無疑問地幫助你。

0

假設TA和TB是在A和B中定義的類型。假設在B或B和A引用中有一個接口I。 TA實現一TB有I型命名爲P.

的公開,可設置屬性,現在你可以這樣做:

TB b = new TB(); 
b.P = new TA(); 

由於TA實現了我,這是可能的。

現在你的對象圖有一個類型的實例可能不序列化和來自組件A