使用嵌套共享类型对复杂类型进行反序列化

时间:2016-05-26 13:31:18

标签: c# xml deserialization xmlserializer complextype

这个问题是关于重新分解XMl模型,该模型适用于我收到的XML但不能改变 - 虽然名称已经改变。

我有以下课程:

[XmlType(AnonymousType = true)]
[XmlRoot(ElementName = "loadsOfMainType", Namespace = "", IsNullable = false)]
class MainType
{
    [XmlElement("mainType")]
    public MyNameForMainType[] MainTypes { get; set; }
}

[XmlRoot(ElementName = "aMainType", Namespace = "", IsNullable = false)]
[XmlType(AnonymousType = true)]
public class MyNameForMainType
{
    [XmlElement("single")]
    public Single Single { get; set; }

    [XmlElement("dual")]
    public Dual Dual { get; set; }
}

[XmlType(AnonymousType = true)]
public class Single
{
    [XmlElement("thing1")]
    public Thing1 MyNameForThing1 { get; set; }

    [XmlElement("thing2")]
    public Thing2 MyNameForThing2 { get; set; }

    [XmlElement("thing3")]
    public Thing3 MyNameForThing3 { get; set; }

    [XmlElement("somthingElseInSingle")]
    public StuffInSingleOnly StuffInSingle { get; set; }
}

[XmlType(AnonymousType = true)]
public class Dual
{
    [XmlElement("thing1")]
    public Thing1 MyNameForThing1 { get; set; }

    [XmlElement("thing2")]
    public Thing2 MyNameForThing2 { get; set; }

    [XmlElement("thing3")]
    public Thing3 MyNameForThing3 { get; set; }

    [XmlElement("someStuffInDual")]
    public StuffInDualOnly StuffInDual { get; set; }
}

正如你所看到的,Thing1,Thing2,Thing3都是转移到另一个班级的候选人。还有其他类可以从相同的因子中受益。

我想为那些" Thing" s创建一个类,并让XMLSerializer将我的MainType与Single或Dual下的新类型一起使用 - 让我们称之为CommonThing,例如,单身会成为:

[XmlType(AnonymousType = true)]
public class Single
{
    public CommonThing CommonThing { get; set; }

    [XmlElement("somthingElseInSingle")]
    public StuffInSingleOnly StuffInSingle { get; set; }
}

我已经在CommonThing上尝试过各种各样的XML序列化装饰,包括Single和CommonThing,而且对于我来说,我能得到的最好的是CommonThing返回null。

是否可以在Single和CommonThing中的任何一个或两个中添加一些属性组合(或者甚至是MainType)?

请注意,我只是将MainType作为我的T传递给ReadAsAsync,因为我还有其他想要使用CommonThing的T(虽然我想我可以传递另一种类型,因为我写了那个位而且我认为如果没有CommonThing,T会被忽略 - 但我认为我真的不应该这样做。

0 个答案:

没有答案