0

这是一个奇怪的问题。

我正在通过 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所以它可能试图做“尽力而为”的事情?

编辑:我终于修复了它,这是一个奇怪的情况,一些编译文件保留在内存中或其他东西中,刚刚删除并重新创建了一些文件,现在它可以工作了。结案。

4

0 回答 0