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