【问题标题】:C# XML Serialization for SilverlightSilverlight 的 C# XML 序列化
【发布时间】:2012-06-25 14:12:20
【问题描述】:

我正在尝试将一个对象从我的 ASP .NET C# MVC3 项目发送到同一解决方案中的 Silverlight 项目。

这是我用来序列化和反序列化的代码,我从 CodeProject (http://www.codeproject.com/Articles/233914/Passing-Objects-between-ASP-NET-and-Silverlight-合作)

    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 Serialize 和 Deseriailize 已经过测试,那么 HTMLDecode 就会留下......但我可以'没有发现任何问题。

我意识到我可能会在最后一次之后剥离所有内容 > 但我想知道是什么原因造成的,因为我不应该这样做。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: xml asp.net-mvc-3 visual-studio-2010 silverlight serialization


    【解决方案1】:

    您应该在 MemoryStream 上使用 .ToArray() 而不是 .GetBuffer()。缓冲区可能大于实际内容,因此最后的无效字节。此外,您应该通过将 IDisposable 资源包装在 using 语句中来正确处理它们:

    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" }
    ) %>
    

    【讨论】:

    • 这看起来很有希望,今天早上我只有一分钟的时间来试一试。我收到“当前上下文中不存在名称 HTML”。尝试添加几个不同的导入似乎没有帮助。稍后我会进一步研究。
    • Html 是每个 ASP.NET MVC 3 视图中可访问的 HtmlHelper 属性。
    • 我使用的是在创建 Silverlight 时创建的 DisplayTestPage。我尝试添加另一个视图并嵌入 Silverlight。 HTML.Hidden 标签有效,但实际的 Silverlight 插件由于某种原因无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多