1

問題

xmlを逆シリアル化するときに問題が発生し、子要素の1つが逆シリアル化されていません。xmlに入力されているにもかかわらず、クラスインスタンスではnullです。

少し背景

XsdObjectGeneratorを使用して、.xsdに基づいてpocoクラスを作成しました。その後、xmlをクラスインスタンスに逆シリアル化し、オブジェクトを操作することができました。

自動生成されたクラスを「TFS」という名前空間でラップして変更しました。

プロジェクトのある時点で、子要素の1つを「COM」と呼ばれる独自の名前空間に配置する必要があることがわかりました。

次にxmlをクラスインスタンスに逆シリアル化しようとしたとき、子要素は逆シリアル化されていません。

これは、子要素の名前空間がCOMに変更されたTFSクラスコードの適切なスニペットです。また、TFS名前空間に残る親要素OrdDtlも含まれます。

[XmlRoot(ElementName="OrdDtl",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable]
    public class OrdDtl
    {
            [XmlElement(Type=typeof(COM.AcctSetup), ElementName="AcctSetup", IsNullable=false, Form=XmlSchemaForm.Qualified, Namespace = Declarations.SchemaVersion)]
        [EditorBrowsable(EditorBrowsableState.Advanced)]
            public COM.AcctSetup __AcctSetup;

        [XmlIgnore]
            public COM.AcctSetup AcctSetup
        {
            get
            {
                if (__AcctSetup == null) __AcctSetup = new COM.AcctSetup();     
                return __AcctSetup;
            }
            set {__AcctSetup = value;}
        }

独自のファイルに含まれているCOM名前空間のAcctSetup宣言は次のとおりです。

[XmlRoot(ElementName = "AcctSetup", Namespace = Declarations.SchemaVersion, IsNullable = false), Serializable]
    public class AcctSetup
    {
......
}

これが私の逆シリアル化関数です:

public static T XMLStringToXMLObject<T>(string pXmlString)
    {
        T retVal = default(T);   

        try
        {
            XmlSerializer vSerializer = new XmlSerializer(typeof(T));
            MemoryStream vMemoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlString));
            XmlTextWriter vXmlTextWriter = new XmlTextWriter(vMemoryStream, Encoding.UTF8);
            retVal = (T)vSerializer.Deserialize(vMemoryStream);
        }
        catch (System.Exception ex)
        {
            if (ExceptionMain.LogException(ex))
                throw;
        }

        return retVal;
    }

COM.AcctSetup要素を逆シリアル化するための支援をいただければ幸いです。追加の情報やコードサンプルが必要な場合はお知らせください。

4

1 に答える 1

1

私はこれを理解しました。デシリアライズしようとしたxmlファイルには、ルート要素に次の属性が含まれていました。

xmlns="tfs"

したがって、xmlファイルのすべての要素はこのxml名前空間の下にありました。

コードへの私の変更は、基本的にAcctSetup要素を別のxml名前空間「com」の下に置くことでした。したがって、ファイルを逆シリアル化するには、ファイルのルート要素に「xmlns = "tfs"」が必要であり、acctsetupの子属性に別の「xmlns="com」」属性が必要です。

これは、AcctSetup要素の上の親要素で受け取っていたファイルの形式ではなかったため、クラスインスタンスに逆シリアル化されました。

私の解決策は、「acctsetup」要素を「tfs」名前空間に再び移動することでした。私の特定の状況では、唯一の欠点はコードのわずかな重複ですが、すべてが再び機能します。

于 2010-09-15T12:57:13.847 に答える