我正在使用Microsoft ASP.NET Web API创建一个服务,具有以下要求:
或者,我发现 YAXLib 提供了一种非常 有用的方法 来处理第3个要求。
因为第二个要求的限制,我不能使用这种方法。我需要像
- 输入必须为XML(不是JSON)
- XML将遵循一种标准(无法向输入XML添加自定义元素名称/属性)
- 在反序列化时遇到异常(即数据值格式错误)时,必须将其记录为警告,并继续解析输入XML
- XML将包含元素集合,其中元素需要反序列化为从基类型派生的类型
或者,我发现 YAXLib 提供了一种非常 有用的方法 来处理第3个要求。
YAXLib同样处理需求#4,但是只能通过在XML中利用自定义属性来实现:
<ListOfObjects>
<Object yaxlib:realtype="System.Int32">7</Object>
<Object yaxlib:realtype="System.Double">3.14</Object>
<Object yaxlib:realtype="System.String">Congrats</Object>
<Object yaxlib:realtype="System.StringSplitOptions">RemoveEmptyEntries</Object>
</ListOfObjects>
因为第二个要求的限制,我不能使用这种方法。我需要像
System.Xml.Serialization.XmlElementAttribute
这样的东西,这样我就可以在代码中指示序列化器,而不是在数据中指示它。是否存在现有的解决方案可以处理所有这些要求?
示例:
输入
<DEALS>
<DEAL>
<COLLATERALS>
<COLLATERAL>xyz</COLLATERAL>
<COLLATERAL>1.2</COLLATERAL>
<COLLATERAL>4.5</COLLATERAL>
</COLLATERALS>
<LOANS>
<LOAN>
<CLOSING_INFORMATION />
</LOAN>
</LOANS>
</DEAL>
</DEALS>
C# 类
public class DEAL
{
[System.Xml.Serialization.XmlElementAttribute("COLLATERALS", typeof(COLLATERALS))]
[System.Xml.Serialization.XmlElementAttribute("LOANS", typeof(LOANS))]
[YAXCollection(YAXCollectionSerializationTypes.RecursiveWithNoContainingElement)]
public object[] Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}
// Remaining implementation details omitted..
}
public class COLLATERALS { /* details omitted.. */ }
public class LOANS { /* details omitted.. */ }
public class COLLATERAL
{
[System.Xml.Serialization.XmlTextAttribute()]
public decimal Value { get; set; }
}
期望输出
DEALS
类中的Items
集合中的对象应反序列化为它们各自的类型:COLLATERALS
和LOANS
。此外,值为“xyz”的第一个抵押品不会被反序列化(因为类型是decimal
),但其余有效的COLLATERAL
项将被反序列化。应该以某种方式记录将'xyz'解析为十进制数时出现的错误。
XmlSerializer
进行多态反序列化的解决方案将是最佳选择。您可以将其发布为答案,我会接受。 - Michael Hornfeck