2010-11-24 57 views
3

我遇到了我相信可能是我的代碼設計的主要問題,我希望這裏有人能向我解釋我將如何解決這個問題。C#如何解決圓形對象參考

我有2個類,每個類都有另一個類的屬性創建一個循環引用。我計劃對這些類進行序列化,並使用XSLT格式化輸出,但我認爲這將因循環引用而失敗。

public class Book 
{ 
    public BookShop TheShop = new BookShop(); 
} 
public class BookShop 
{ 
    list<Book> Books = new list<Book>(); 
} 

所以從這個例子中每本書將在書店和各書店都會有很多書。如果我序列化書店,它將序列化每本書,然後序列化書店等等。我應該如何處理?

回答

6

標籤TheShop具有防止其序列化的屬性。

[XmlIgnore]與默認序列化程序。

http://www.codeproject.com/KB/XML/GameCatalog.aspx

也許只是你的榜樣有問題,不是你真正的代碼:不要使用公共字段,但性能。我認爲XmlSerializer甚至沒有序列化公共字段。

+0

對不起,一個快速創建的例子,真正的代碼更詳細。 – Jammy 2010-11-24 15:10:51

1

[XmlIgnore]添加到TheShop屬性以防止它被序列化。

然後,您可以在反序列化時手動設置它。

0

如果你打算使用System.Xml.Serialization.XmlSerializer,你應該裝點TheShopSystem.Xml.Serialization.XmlIgnoreAttribute

public class Book 
{ 
    [System.Xml.Serialization.XmlIgnore] 
    public BookShop TheShop; 
} 

也就是說,假設BookShop是要序列化的根對象。 MSDN

+0

這是否基本上告訴序列化程序跳過該屬性。這是可以的,但如果我在不同的時間序列化一本書,我不能看到它從哪個商店。也忘記了一秒鐘的XML我甚至可以在我的對象之間有循環引用?聽起來對我來說是一個非常糟糕的主意。 – Jammy 2010-11-24 15:09:11

1

最好的做法是讓BookShop類實現一個接口(IBookShop),然後讓Book類存儲接口而不是具體類。您還應該使BookShop成爲Book類中的一個屬性:

public class Book 
{ 
    public Book(IBookShop bookShop) 
    { 
     TheStop = bookShop; 
    } 
    [XmlIgnore] 
    public IBookShop TheShop { get; set; } 
} 
public interface IBookShop 
{ 
    void SomeMethod(); 
} 
public class BookShop : IBookShop 
{ 
    list<Book> Books = new list<Book>(); 
    public void SomeMethod() 
    { 
    } 
} 
0

首先您需要檢查這是否確實是一個問題。如果你有一本書的時候一直關心書店,並且你一直關心書店的所有書籍,那麼把整個圖表連續化是非常明智的。這不會導致無限循環,因爲序列化使用標識符來指示對已經序列化的對象的引用(如果您使用類型的類型的循環引用對圖進行XML序列化,但存在一個錯誤,但這是一個錯誤,而不是固有的XML序列化問題,因爲可以解決的事實證明了這一點,請參閱Why do I get a "System.StackOverflowException was unhandled " exception when serializing?)。

因此,也許你根本不想在這裏做任何事情,而且你很好。

否則,問題是 - 你想要連載什麼?到目前爲止,大多數建議都是爲了不連載TheShop屬性。這可能很好,或者如果您以後需要訪問該商店,這可能毫無用處。

如果您對每家商店都有某種標識符(身份證號碼,uri),那麼您也許可以記憶 - 訪問TheShop首先查看私人_theShop是否爲空,如果是,則將相關對象加載到基於該標識符的_theShop。那麼你只需要序列化標識符,而不是完整的對象。最後,如果您使用XSLT將輸出格式化爲某種其他規範(無論是用於顯示的XHTML還是其他規範),那麼您可能會發現只需滾動您自己的XML序列化就可以更簡單一些。雖然在許多方面這是一項更爲複雜的任務,但通過序列化生成的XML對於重新格式化顯示來說並不是特別方便的事實可能意味着總體而言,這種方式更簡單。事實上,如果這是您序列化的唯一理由(您將永遠不會從所生成的XML中反序列化),那麼它可能會更容易,因爲您只需考慮顯示的XML需求,而不用擔心其他問題。因此,串行化可能根本不是最好的方法,但只需要在另一個類中使用ToXml()方法或WriteBookToXml()方法。