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 正在生成并出错。

{"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)来调用该方法,其中 xml 输入是字符串。这将强制编译器使用给定类的定义来反序列化 XML 输入。这样,您甚至不必更改序列化中的编码。如果这也是您可能知道或可能不知道要反序列化的数据类型的情况,您可以使用策略设计模式,在其中注册 XML 的根类型及其关联的泛型类型。稍后,只要根类型已注册,您就可以引用该注册表并任意反序列化任何 XML 输入。这也是我通常使用的技巧。如果需要更多信息,请告诉我,我会详细解释。

此外,如果您运行的是 IE 9,则 IE 9 的新更新使查看 XML 变得困难。按 F12 - 转到开发人员工具并更改您的浏览器模式以运行 IE 8 而不是 IE 9。

于 2012-04-25T20:47:22.543 回答