[LINQ]XmlSerializer 發生循環參考錯誤
LINQ 2 SQL 產生的dbml, 可以很快地產生Enitity以及簡易的資料庫操作.
由其是資料庫的關聯有設計進去時, 更可以看到其ORM的優勢,
當我們需要將Entity匯出成Xml格式時, 可以用XmlSerializer,
Object XMLSerializer 參考: http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp
1: String XmlizedString = null;
2: using (MemoryStream memoryStream = new MemoryStream())
3: {
4: XmlSerializer xs = new XmlSerializer(pObject.GetType());
5: XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.Default);
6: xs.Serialize(xmlTextWriter, pObject);
7: XmlizedString = Encoding.Default.GetString(memoryStream.ToArray());
8: }
9: return XmlizedString;
但今天當有個需求要將設有關聯的Entity轉出成Xml時,
卻出現了System.InvalidOperationException 檢測到循環參考的錯誤,
XmlSerializer 真的太神了, 會檢測是否循環參考而導致無窮迴圈,
使我們在引用時不會把系統搞掛了,
如果你的需求是將Entity本身的值匯出, 不含關聯的物件, 參考: http://blog.couldhll.com/tag/linq/
只要回到dbml, 選到 Entity間的線(關聯), 屬性表中打開子屬性, "存取"="Internal" 就可以了.
如: Pub <- User (one2many)
User可能會加入多個Pub, 當"存取"="Internal" 時, 原本在跨組件時我們可以從 User.Pub拿個一個EntitySet<Pub>物件,
現在不行了, 參考: http://msdn.microsoft.com/zh-tw/library/ba0a1yw2(v=vs.80).aspx
如果你有分組件(dll), 就必須用Proxy Pattern來處理囉!! 參考: http://en.wikipedia.org/wiki/Proxy_pattern