0

我試圖從我的ASP .NET C#MVC3項目中將對象發送到同一解決方案中的Silverlight項目。Silverlight的C#XML序列化

這是我用來序列化和反序列化的代碼,我從CodeProject(http://www.codeproject.com/Articles/233914/Passing-Objects-between-ASP-NET-and-Silverlight -Co)

public string getSerializedGameData() 
    { 

      Game g = Game.populateByID(this.gameID); 
      MemoryStream mem = new MemoryStream(); 
      XmlSerializer xs = new XmlSerializer(typeof(Game)); 
      mem.Seek(0, SeekOrigin.Begin); 
      xs.Serialize(mem, g); 
      byte[] data = mem.GetBuffer(); 
      return Encoding.UTF8.GetString(data, 0, data.Length); 
    } 

    public static Game GetDeserializedGameObject(string xmlData) 
    { 
     StringReader sr = new StringReader(xmlData); 
     XmlSerializer xs = new XmlSerializer(typeof(Game)); 
     return (Game)xs.Deserialize(sr); 
    } 

這就是似乎工作的序列化和反序列化。

在我的ASPX頁面,我已經把:

<input type="hidden" id="game" value="<%=HttpUtility.HtmlEncode(Game.populateByID(Convert.ToInt32(Request["gameID"])).getSerializedGameData()) %>" /> 

哪些應該得到的對象,它建設成一個字符串,並對其進行編碼的HTML。然後嵌入爲隱藏字段。當我運行我的錯誤現在

  string s = HttpUtility.HtmlDecode(HtmlPage.Document.GetElementById("game").GetProperty("value").ToString()); 
      Game g = Game.GetDeserializedGameObject(s); 

對其進行解碼,我使用

Data at the root level is invalid. Line 443, position 8 

望着數據我看到有效的XML直到...

... 
    </gameEvents> 
</Game>����������� 

除了成千上萬的無效字符,我刪除它們以保持它的簡短。

查看源我看到:

... 
    &lt;/gameEvents&gt; 

&lt;/Game&gt;" /> 

所以它不會出現是一個編碼問題。

最初我相信額外的字符超出了數據緩衝區的範圍,但我沒有看到它出現在源代碼中,並且如果XML序列化和Deseriailize已經過測試,則會留下HTMLDecode ..但我可以沒有發現任何問題。

我意識到我可以在去年之後剝離掉所有東西,但是我想知道是什麼原因造成的,因爲我不應該那樣做。

任何幫助將不勝感激,謝謝!

回答

1

您應該在MemoryStream上使用.ToArray()而不是.GetBuffer()。緩衝區可能大於實際內容,因此最後的無效字節。另外,應通過包裝他們using聲明妥善處置IDisposable的資源:

public string getSerializedGameData() 
{ 
    Game g = Game.populateByID(this.gameID); 
    using (MemoryStream mem = new MemoryStream()) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(Game)); 
     xs.Serialize(mem, g); 
     byte[] data = mem.ToArray(); 
     return Encoding.UTF8.GetString(data, 0, data.Length); 
    } 
} 

public static Game GetDeserializedGameObject(string xmlData) 
{ 
    using (StringReader sr = new StringReader(xmlData)) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(Game)); 
     return (Game)xs.Deserialize(sr); 
    } 
} 

現在,我們有固定的服務器端代碼,視圖也需要修復。你應該在你的視圖中使用HTML幫助器,它會照顧正確編碼隱藏字段中的值:

<%= Html.Hidden(
    "game", 
    Game.populateByID(Convert.ToInt32(Request["gameID"])).getSerializedGameData(), 
    new { id = "game" } 
) %> 
+0

這看起來像是有承諾,今天早上我只有一分鐘時間讓它旋轉。我得到'名稱HTML在當前上下文中不存在'。試圖添加幾個不同的進口似乎沒有幫助。我會稍微考慮一下。 – pcaston2

+0

'Html'是在每個ASP.NET MVC 3視圖中可訪問的HtmlHelper屬性。 –

+0

我使用創建Silverlight時創建的DisplayTestPage。我嘗試添加另一個視圖並嵌入Silverlight。 HTML。隱藏的標籤正常工作,但實際的Silverlight插件由於某種原因不起作用。 – pcaston2