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