2012-09-13 178 views
0

我正在使用XMLSerialization通過管道通信過程將數據從基於客戶端的Win7應用程序傳遞到我們的服務器(Server 2008 R2)。我被引入到這個項目中去完成之前的開發者的努力,他們放棄了它......因此,我目前正在嘗試修復VS2010中的C#代碼,這是行不通的。需要幫助XMLSerialize對象內容

問題是我無法從「public partial class Test」中的以下方法獲得結果輸出的完整序列化。我們在MS Compact Server數據庫(名爲「Test」)中定義了一個表,它與下面的每個項目相匹配,並且基於兩個表中匹配的TestID,對「Channel」表具有FK。 EntityCollection是基於其的「通道」表的關係:

public Test(Guid TestID, String TestName, String TestRemarks, String ScriptPath, 
      EntityCollection<Channel> TChannels) 
{ 
    ID = TestID; 
    Name = TestName; 
    Remarks = TestRemarks; 
    Path = ScriptPath; 
    Channels = TChannels; 
} 

這裏是它是如何在方法的執行中使用的樣品:

Test T = new Test(NewID, "Test1", "Test_120912-1729", 
      "C:\\Temp\\TestScript_16.txt", TChannels); 

這裏是串行化的結果過程:

<DataCore xsi:type="Test"> 
    <ID>bc6a8ef7-c31f-404d-8108-86219d45be63</ID> 
    <Name>Test1</Name> 
    <Remarks>Test_120912-1729</Remarks> 
    <Path>C:\Temp\TestScript_16.txt</Path> 
</DataCore> 

前四個參數序列化很好,但最後一個(在EntityCollection)未能這樣做。但是,如果我嘗試單獨序列化「TChannels」(在「測試」功能之外),則每個測試通道的序列化都可以很好地工作。我不完全理解利用XMLserialization解決這個問題的限制/要求。爲什麼我無法序列化函數內的EntityCollection <>?

感謝您的協助!

+0

這可能與XmlSerializer的不加載子實體 - 他們是懶加載默認。 Channels.IsLoaded的狀態如何?在嘗試序列化之前你有沒有試過Channels.Load()? –

+0

Channels.IsLoaded是「false」。根據您的建議,w當我嘗試在序列化之前插入一行時,「Channels.Load();」 ,VS編譯器指出「'Channels'不包含'Load'的定義。這應該是我的一個線索,但是,我不知道我該如何處理'Load()'定義。感謝您的幫助! – David

+0

如果您的類不是EF,則可能必須使用LoadProperty:http://msdn.microsoft.com/en-us/library/dd395523和http://msdn.microsoft.com/en-us/library/ bb896272%28V = VS.100%29。對不起,最後一次沒有發現。另一種可能性是用DataContractSerializer替換普通的XmlSerializer,儘管我不認爲這消除了加載子關係的需要:http://stackoverflow.com/questions/6234290/serialize-entity-framework-object-with-children -to-XML文件。對不起,我不能更具體。 –

回答

0

我終於找到了解決上述問題的方法。雖然許多建議都表示讚賞,但他們都沒有提供解決方案,無法對XmlSerialize子EntityCollection進行無效化。我更深入地挖掘,並調查了ADO.NET框架和汽車內發現了我的數據庫中生成代碼Model.Designer.cs文件,[XmlIgnoreAttribute()]附近的在我的測試導航屬性的開始(EdmEntityTypeAttribute) 。

我只是完全刪除了[XmlIgnoreAttribute()]行,現在所有來自EntityCollection <>的「Channels」的子對象都被正確序列化。我希望這可以幫助其他人無法序列化子對象。

感謝@戴夫R.