我有一个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();
}
}
看起来很直接。但是,当我尝试DeSerialize它时,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>
任何想法发生了什么?
答案 0 :(得分: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&lt;来调用该方法。 Class1&gt;(_ xml_input)其中xml输入是字符串。这将迫使编译器使用给定类的定义来反序列化XML输入。这样你甚至不必更改序列化中的编码。如果您也可能知道要反序列化的数据类型,则可以使用策略设计模式,在该模式中,您可以使用相关的泛型类型注册XML的根类型。稍后,只要注册了根类型,就可以引用该注册表并任意反序列化任何XML输入。这也是我通常使用的技巧。如果需要更多,请告诉我,我会详细解释。
此外,如果您正在运行IE 9,则对IE 9的新更新使查看XML变得困难。按F12 - 转到开发人员工具并将浏览器模式更改为IE 8而不是IE 9。