0

ASP .NET C# MVC3 プロジェクトから同じソリューション内の Silverlight プロジェクトにオブジェクトを送信しようとしています。

これは、シリアル化と逆シリアル化に使用しているコードです。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 シリアライズとデシリアライズがテストされている場合は、HTMLDecode が残ります..しかし、何も見つけることができませんそれは間違っています。

おそらく最後の > の後にすべてを取り除くことができると思いますが、そうする必要はないので、何が原因なのか知りたいです。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

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" }
) %>
于 2012-06-25T06:12:20.600 に答える