当将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元素,但我想看看这种情况下的做法是什么,并找到替代解决方案。
谢谢你的帮助。
库什在设计上,必须有一种方法让运行时知道应该将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数据,那么强类型版本可能会得到我的投票。