当将c#对象搜索为xml时,是否可能将继承的类命名为相同的xml名称?

本文关键字:xml 命名为 继承 名称 搜索 对象 当将 是否 | 更新日期: 2023-09-27 17:50:11

My Classes:

public class SectionDto
{
    [XmlAttribute]
    public int Id { get; set; }
    [XmlElement("subSection1", typeof(departmentDto)),
     XmlElement("subSection2", typeof(divisionDto))]
    public List<CommonSubSectionDto> SubSection { get; set; }
}
public class CommonSubSectionDto
{
}
public class DepartmentDto : CommonSubSectionDto
{
    [XmlAttribute]
    public int Id { get; set; }
    [XmlElement]
    public string Summary { get; set; }
}
public class DivisionDto : CommonSubSectionDto
{
    [XmlAttribute]
    public int Id { get; set; }
    [XmlElement]
    public string Name { get; set; }
}

XML如下所示:

<root>
    <Section>
        <SubSection1 Id="123">
            <Summary> Summary 123 </Summary>
        <SubSection1 />
        <SubSection1 Id="124">
            <Summary> Summary 124 </Summary>
        <SubSection1 />
        <SubSection2 Id="987">
            <Name> Division Name </Name>
        <SubSection2 />
    <section>
    ...
</root>

所以我希望它这样,而不是继承的类被赋予单独的名称,如"SubSection1"answers"SubSection2",我希望它被称为"子"。

这可能吗?如果是的话,有人能给点建议吗?还有别的选择吗?

我还在考虑删除我的继承类,并将其替换为单个类,称为子部分它具有两个元素,然而其中一个元素摘要或名称将是一个空的xml元素,但我想看看这种情况下的做法是什么,并找到替代解决方案。

谢谢你的帮助。

库什

当将c#对象搜索为xml时,是否可能将继承的类命名为相同的xml名称?

在设计上,必须有一种方法让运行时知道应该将xml元素反序列化为哪种类型。如果两个DTO的xml标记相同,则在反序列化时,系统无法推断出适当的目标类型。但是你可以稍微改变一下。以下定义:

public class SectionDto
{
    [XmlAttribute]
    public int Id { get; set; }
    public List<SubSection> SubSections { get; set; }
}
[XmlInclude(typeof(DepartmentDto))]
[XmlInclude(typeof(DivisionDto))]
public abstract class SubSection
{
    [XmlAttribute]
    public int Id { get; set; }
}
public class DepartmentDto : SubSection
{
    [XmlElement]
    public string Summary { get; set; }
}
public class DivisionDto : SubSection
{
    [XmlElement]
    public string Name { get; set; }
}

给这个xml:

<SectionDto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Id="0">
  <SubSections>
    <SubSection xsi:type="DepartmentDto" Id="123">
      <Summary>Summary 123</Summary>
    </SubSection>
    <SubSection xsi:type="DepartmentDto" Id="124">
      <Summary>Summary 124</Summary>
    </SubSection>
    <SubSection xsi:type="DivisionDto" Id="987">
      <Name>Division Name</Name>
    </SubSection>
  </SubSections>
</SectionDto>

但是它和xsi:type属性的问题是一样的。

With this:

public class SubSection
{
    [XmlAttribute]
    public int Id { get; set; }
    [XmlElement]
    public string Summary { get; set; }
    [XmlElement]
    public string Name { get; set; }
}
你得到这个xml:
<SectionDto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Id="0">
  <SubSections>
    <SubSection Id="123">
      <Summary>Summary 123</Summary>
    </SubSection>
    <SubSection Id="124">
      <Summary>Summary 124</Summary>
    </SubSection>
    <SubSection Id="987">
      <Name>Division Name</Name>
    </SubSection>
  </SubSections>
</SectionDto>

这是您的建议之一,但您可能需要在反序列化时编写更多代码,以便根据设置的属性自行推断对象的适当类型。只有当我必须为另一个系统生成xml时,我才会选择最后一个版本(这样我就不必在我的应用程序中进行反序列化),但是如果我必须在之后加载xml数据,那么强类型版本可能会得到我的投票。