这是一个奇怪的问题。
我正在通过 TCP 连接接收 XML 消息并且接收 XML 消息工作正常,我已经测试过,我收到的 XML 消息是
<command><printreq><![CDATA[Printed text \r\n Second line with {012} code and <LF> code]]></printreq></command>
当我尝试在我的应用程序中解析它时,我得到了异常"<command xmlns=''> was not expected."
但是,我已经提取了涉及到 LINQPad 的方法来测试它们,并且它在那里工作。那么有没有我没有看到的隐藏设置?
这是通过 XSD.exe 为我的架构生成的代码:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class command {
private object itemField;
private ItemChoiceType1 itemElementNameField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("printreq", typeof(string))]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
public object Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public ItemChoiceType1 ItemElementName {
get {
return this.itemElementNameField;
}
set {
this.itemElementNameField = value;
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)]
public enum ItemChoiceType1 {
/// <remarks/>
printreq,
}
}
这是我用于反序列化字节数组的方法(字节来自 UTF8 解码字符串):
public static object DeserializeFromXmlBytes(byte[] objectBytes, Type targetType)
{
var readerSettings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Fragment
};
var serializer = new XmlSerializer(targetType);
using (var memStream = new MemoryStream(objectBytes))
{
var xmlReader = XmlReader.Create(memStream, readerSettings);
return serializer.Deserialize(xmlReader);
}
}
当我简单地在 LINQPad 中执行此操作时,它可以工作:
string xml = "<command><printreq><![CDATA[Printed text \r\n Second line with {012} code and <LF> code]]></printreq></command>";
var b = System.Text.Encoding.UTF8.GetBytes(xml);
var o = DeserializeFromXmlBytes(b, typeof(command));
Console.WriteLine(o); // Outputs what I expect
但是,在我的应用程序中反序列化失败,但我提到的例外。有什么我在这里看不到的吗?
当我对根元素进行硬编码时,例如:
var xRoot = new XmlRootAttribute
{
ElementName = "command",
IsNullable = true
};
它解析没有错误,但命令是错误的。生成的命令具有子元素breakend
(也已指定,但未在我的代码中列出)而不是printreq
. 这越来越奇怪了。
好的,breakend
第一种类型是否被列为ItemChoiceType1
所以它可能试图做“尽力而为”的事情?
编辑:我终于修复了它,这是一个奇怪的情况,一些编译文件保留在内存中或其他东西中,刚刚删除并重新创建了一些文件,现在它可以工作了。结案。