[LINQ]XmlSerializer 發生循環參考錯誤

[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