2012-09-04 36 views
2

我想弄清楚一些方法來使我的一些數據庫對象可序列化到和從XML文件。維護與序列化的對象關係映射

我正在爲我的對象使用實體框架數據模型,並使它們可供我的客戶端使用WCF RIA Services。我希望能夠從數據庫中獲取給定的對象並將其序列化爲XML文件,反之亦然。

在過去,我已經嘗試這樣做,是我遇到的問題如下:

  • 如果我執行IXmlSerializable的每個對象,然後在反序列化時每個對象一無所知的其他對象被反序列化。它處於一種氣泡之中,無法將外鍵ID解析爲對象引用。

  • 對於上述問題,我發現的唯一解決方案是編寫一個大的序列化和反序列化方法,其中父對象跟蹤引用並根據需要分配它們。這樣做感覺像是一種非常糟糕的方式,因爲我必須在對象發生變化時不斷維護這種大型方法,而不是每個對象都負責自己的序列化。

  • 嵌套對象的標準XML設計彼此不適用於ORM模型。原因是一些對象可能有多個其他對象的引用並被其使用,所以我不能將這些對象創建爲父對象的子元素。

考慮下面的XML:

<User Name="John Smith"> 
    <FavoriteMovies> 
     <Movie Name="The Big Lebowski" Year="1998" ... /> 
    </FavoriteMovies> 
</User> 

<User Name="Robert Jones"> 
    <FavoriteMovies> 
     <Movie Name="The Big Lebowski" Year="1998" ... /> 
    </FavoriteMovies> 
</User> 

顯然我不應該同一部電影的兩個實例。而是序列化應該是這個樣子:

<User Name="John Smith"> 
    <FavoriteMovies> 
     <Id>5</Id> 
    </FavoriteMovies> 
</User> 

<User Name="Robert Jones"> 
    <FavoriteMovies> 
     <Id>5</Id> 
    </FavoriteMovies> 
</User> 

<Movies> 
    <Movie Id="5" Name="The Big Lebowski" Year="1998" ... /> 
</Movies> 

WCF已經知道如何序列化和反序列化我的對象爲SOAP/JSON的/ etc。使用數據服務。這是我可以在序列化到XML文件時重用的東西嗎?

對我來說,依靠數據庫外鍵ID可能不會工作,因爲在很多情況下對象將具有默認ID。 WCF設法對這些對象進行序列化,而不必依賴這些對象,並且只有在保存到SQL數據庫後纔會分配這些ID。

回答

0

不熟悉EF以及對象模型如何工作,但對於大多數成功通過WCF序列化/反序列化的對象,您可以直接使用DataContractSerializer。參考this article進行簡單的演練。

由於您不需要XML可以互操作,所以您也可以使用preserveObjectReferences設置來避免冗餘數據。

+0

看起來很有希望,儘管它看起來非常冗長,它序列化有關我的EntityFramework模型容器的信息。 –

0

我強烈建議Json.NET串行器http://json.codeplex.com/通過DataContractSerializer只要後者是有點bug。例如,你也可以看看這個問題,以獲得更多關於爲什麼Json.Net序列化器更好的研究。