首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多态性和异常处理的XML反序列化

基于多态性和异常处理的XML反序列化
EN

Stack Overflow用户
提问于 2012-12-03 17:24:17
回答 1查看 966关注 0票数 5

我正在使用Microsoft创建一个具有以下要求的服务:

  1. 输入必须是XML (没有json)。
  2. XML将遵循标准(不能向输入xml添加自定义元素名称/属性)
  3. 在反序列化过程中遇到异常(即格式错误的数据值)时,必须将其记录为警告,并且必须继续对输入xml进行解析。
  4. XML将包含元素集合,其中需要将元素反序列化为从基类型派生的类型。

需求1和2只需定义我的输入。我开始使用内置的System.Xml.Serialization.XmlSerializer类来开发我的解决方案,但不得不放弃它,因为它无法处理需求#3。

或者,我找到了YAXLib,它提供了一个非常适合处理需求#3的有用方式

YAXLib还处理需求#4,但只能使用XML中的自定义属性:

代码语言:javascript
复制
  <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>

由于需求2,我不能使用这种方法。我需要一些类似于System.Xml.Serialization.XmlElementAttribute的东西,这样我就可以在代码中而不是在数据中指示序列化程序。有一个现有的解决方案来处理所有这些需求吗?

示例:

输入

代码语言:javascript
复制
<DEALS>
    <DEAL>
        <COLLATERALS>
            <COLLATERAL>xyz</COLLATERAL>
            <COLLATERAL>1.2</COLLATERAL>
            <COLLATERAL>4.5</COLLATERAL>
        </COLLATERALS>
        <LOANS>
            <LOAN>
                <CLOSING_INFORMATION />
            </LOAN>
        </LOANS>
    </DEAL>
</DEALS>

C#类

代码语言:javascript
复制
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类的Item集合中的对象应该反序列化为各自的类型:COLLATERALSLOANS。此外,值'xyz‘的第一个担保品不会反序列化(因为类型是decimal),但是剩余的有效COLLATERAL项将被反序列化。应该以某种方式记录将“xyz”解析为“十进制”的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 20:09:14

您可以使用( XSD文件)来定义XML文件的有效格式。现有的工具将验证特定文件是否符合架构。

通过公开提供此模式,您将能够允许客户端验证自己的请求,而无需实际与web服务交互。这将使他们能够看到他们的投入是否有效,如果他们需要对具体需要修改的内容进行复杂的分析以符合要求,他们将能够自己做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13688489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档