1

こんにちは、次の逆シリアル化コードがあります

        public static T DeserializeXML<T>(String xml) where T : class
        {
            T newObject = null;
            XmlSerializer s = new XmlSerializer(typeof(T));
            using (StringReader sw = new StringReader(xml))
            {
                newObject = (T)s.Deserialize(sw);
            }
            return newObject;
        }

デシリアライズしようとする私のメッセージ

<Data>
<ItemIn date="2012-08-09T10:25:54.06+01:00" itemId="000007721" Id="1">   <Extensions><Info Id="parts" order="issue"/></Extensions></ItemIn>
</Data>

しかし、私Extensionsはいつもnullそこにいる元のクラスに部分的に逆シリアル化されることはありません。クラスの残りの部分は問題ありません。

何をチェックするべきか提案はありますか?

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class ItemTransferIn {

    private Extensions extensions;

    private System.DateTime date;

    private string itemId;

    private string Id;

    /// <remarks/>
    public ItemTransferInExtensions Extensions {
        get {
            return this.extensions;
        }
        set {
            this.extensions = value;
        }
    }

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class Extensions {

    private RecipeInfo recipeInfoField;

    /// <remarks/>
    public RecipeInfo RecipeInfo {
        get {
            return this.recipeInfoField;
        }
        set {
            this.recipeInfoField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class RecipeInfo {

    private string recipeIdField;

    private string orderIdField;

    private string itemBarcodeIdField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Id {
        get {
            return this.recipeIdField;
        }
        set {
            this.recipeIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string order {
        get {
            return this.orderIdField;
        }
        set {
            this.orderIdField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string itemBarcodeId {
        get {
            return this.itemBarcodeIdField;
        }
        set {
            this.itemBarcodeIdField = value;
        }
    }
}
4

1 に答える 1

2

拡張機能の場合...コードを編集したようです。がある

private Extensions extensions;

...

/// <remarks/>
public ItemTransferInExtensions Extensions {
    get {
        return this.extensions;
    }
    set {
        this.extensions = value;
    }
}

率直に言って、それはコンパイルさえすべきではありません。クラスはありませんItemTransferInExtensions

また、動作しInfoません:

/// <remarks/>
public RecipeInfo RecipeInfo {...blah...}

一致しません<Info ..../>。したがって、xsd を修正して cs を再生成するか、xml を修正します。しかし、現時点では一致しません

RecipeInfoプロパティの名前を に変更しInfo(属性を追加することもできます)、Extensions / ItemTransferInExtensions (および欠落している}) を修正し、xml に一致するようにルート クラスを追加した後:

public class Data
{
    public ItemTransferIn ItemIn { get; set; }
}

...それはすべて正常に動作します:

static void Main()
{
    string msg = @"<Data>
<ItemIn date=""2012-08-09T10:25:54.06+01:00"" itemId=""000007721"" Id=""1"">   <Extensions><Info Id=""parts"" order=""issue""/></Extensions></ItemIn>
</Data>";
    var obj = DeserializeXML<Data>(msg);

    Console.WriteLine(obj.ItemIn.Extensions.Info.order); // issue
}

ただし、率直に言って、手動で行う方が簡単です。

public class Data
{
    public ItemTransferIn ItemIn { get; set; }
}
public class ItemTransferIn
{
    [XmlAttribute("date")]
    public DateTime Date { get; set; }

    [XmlAttribute("itemId")]
    public string Itemid { get; set; }

    [XmlAttribute]
    public int Id { get; set; }

    public Extensions Extensions { get; set; }
}
public class Extensions
{
    public ExtensionsInfo Info { get; set; }
}
public class ExtensionsInfo
{
    public int Id { get; set; }
    [XmlAttribute("order")]
    public string Order { get; set; }
}
于 2012-08-23T06:00:50.393 に答える