0

シンプルなクラスをシリアル化する C# Web サービスがあります。

    [Serializable]
    [XmlInclude(typeof(Bitmap))]
    [XmlTypeAttribute(Namespace = "http://tempuri.org/")]
    public class Class1 
    {
        private static Bitmap _myImage = new Bitmap(@"C:\WebApplication1\ClassLibrary1\Untitled.png");


        public Bitmap MyImage
        {
            get { return _myImage; }

            set
            {
                _myImage = value;
            }
        }
    }

シリアル化を行う asmx.cs コードは次のとおりです。

[WebMethod]
public string HelloWorld()
{
    var c = new Class1();
    XmlSerializer serializer = new XmlSerializer(typeof(Class1));

    return XMLSerializer(c);
}

public string XMLSerializer(object pObject)
{
    try
    {
        XmlSerializer xs = new XmlSerializer(pObject.GetType());
        using (StringWriter stream = new StringWriter())
        {
            xs.Serialize(stream, pObject);
            stream.Flush();
            return stream.ToString();
        }
    }
    catch (Exception ex)
    {
        return ex.ToString();
    }

}

かなりまっすぐに見えます。ただし、XmlSerializer によって生成された XML は生成され、DeSerialize しようとするとエラーが発生します。

{"There is an error in XML document (5, 5)."}
{"Parameter is not valid."}

生成された XML を IE にロードしようとすると、このエラーが発生します。

Switch from current encoding to specified encoding not supported. Error processing resource 'file:///C:/Users/mhall15/Deskt...

<?xml version="1.0" encoding="utf-16"?>

生成された XML は次のとおりです。

<?xml version="1.0" encoding="utf-16"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyImage xmlns="http://tempuri.org/">
    <Palette />
  </MyImage>
</Class1>

何が起こっているのですか?

4

1 に答える 1

0

シリアル化中に、「encoding="utf-16」を「encoding="utf-8"」に置き換えると、問題が解決します。問題の原因-よくわかりませんが、何度も遭遇しました。 、そしてそれが私がそれを扱った方法です。

それがIEの問題に対処する方法です。

デシリアライズはこれらの行の中にある必要があります。私が通常使用する種類の任意のコードを投稿しています。

public static object DeserializeFromXML<T>(string _input)
    {
        object _temp = Activator.CreateInstance<T>();
        Type expected_type = _temp.GetType();
        _temp = null;
        XmlSerializer serializer = new XmlSerializer(expected_type);
        StringReader stringWriter = new StringReader(_input);
        object _copy = serializer.Deserialize(stringWriter);
        return _copy;
    }

上記の例では、再利用性のためにテンプレートを使用しています。DeserializeFromXML <Class1>(_ xml_input)と言うことでメソッドを呼び出すことができるはずです。ここで、xmlinputは文字列です。これにより、コンパイラは指定されたクラスの定義を使用してXML入力を逆シリアル化するように強制されます。そうすれば、シリアル化でエンコーディングを変更する必要さえありません。デシリアライズするデータ型がわかっている場合とわからない場合もある場合は、XMLのルート型を関連する汎用型に登録する戦略設計パターンを使用できます。後で、そのレジストリを参照し、ルートタイプが登録されている限り、任意のXML入力を逆シリアル化できます。それは私が普段使っているトリックでもあります。これについてさらに必要な場合は、お知らせください。詳しく説明します。

さらに、IE 9を実行している場合、IE 9の新しい更新により、XMLの表示が困難になります。F12キーを押します-開発者ツールに移動し、ブラウザモードを変更してIE9ではなくIE8として実行します。

于 2012-04-25T20:47:22.543 に答える