加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – DataContract Serializer数组节点名称’d3p1′

发布时间:2020-12-16 03:28:45 所属栏目:asp.Net 来源:网络整理
导读:有人能告诉我“d3p1”节点名称在这里意味着什么吗? ActionMessage Data xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" d3p1:anyType i:type="Agreement" /d3p1:anyType d3p1:anyType i:type="Agreement" shortened 我收到了许多
有人能告诉我“d3p1”节点名称在这里意味着什么吗?

<ActionMessage>
        <Data xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
          <d3p1:anyType i:type="Agreement">
 </d3p1:anyType>
      <d3p1:anyType i:type="Agreement"> shortened

我收到了许多“看起来很难看”和“如果d3p1发生了什么改变”??这个对我的asp webapi项目中的默认序列化的评论.我说它的机器可读性很好.但我很好奇为什么它看起来像这样.

以下是详细信息,我在控制器上有一个GET动词,它返回一个可枚举的ActionMessage

public IEnumerable<ActionMessage> Get(Guid)

ActionMessage不能是通用的(如果这甚至会有帮助),因为列表将包含不同泛型类型的操作消息. “newagreement”,“keychange”等

它看起来像ActionMessage< NewAgreement>或ActionMessage< KeyChange>还有很多. get中没有办法做到这一点,因为get返回了很多“类型”的动作消息.基类或接口之外. I.E. ActionMessage的<即时聊天>但这些消息没有任何共同之处.

这是现在的动作消息.

public class ActionMessage
{
    [DataMember]
    public Status Status { get; set; }
    [DataMember]
    [XmlElement(ElementName = "Agreement")]
    [XmlArrayItem(ElementName = "testnode")]
    public List<object> Data { get; set; }
    [DataMember]
    public MessageTypes Type { get; set; }
    [DataMember]
    public Guid Id { get; set; }
}

请注意,“麻烦的”XML来自data属性.

思考? XML人类可读性是否重要?我应该经历从datacontract序列化器切换到xml序列化器的痛苦吗?这可能会启用元素名称属性,但我更喜欢把它全部留下来,虽然我可以完全控制生成的XML,但我真的需要,还是我真的在乎?

解决方法

在努力解决这一问题之后,我得出的结论是,通常最好尽可能明确地使用数据合同.在这种情况下,我会拆分List< object>将数据分成多个显式列表,即List< Agreement>协议;列表与LT; KeyChange> KeyChanges;等等.生成的XML可能如下所示:

<ActionMessage>
    <Status>...</Status>
    <Agreements>
        <Agreement>...</Agreement>
    </Agreements>
    <KeyChanges/>
    ...
</ActionMessage>

一些元素将为空(您可以配置序列化程序以省略这些元素),但每个元素都是显式的,易于阅读,解析和反序列化.更重要的是,架构的消费者确切地知道会发生什么.

还有另一种选择,那就是定义协议,KeyChange等都可以实现的某种接口(例如’IData’)并更改List< object>列表的数据< IData>数据.它会产生稍微漂亮的XML文档,但您必须维护已知类型的列表,以确保可以反序列化所有实现. XML看起来像这样:

<ActionMessage>
    <Status>...</Status>
    <Data>
        <IData xsi:type="Agreement">..</IData>
        <IData xsi:type="KeyChange">..</IData>
    </Data>
    <KeyChanges/>
    ...
</ActionMessage>

但是,这会导致脆弱的反序列化,并且可能导致消息的向前/向后兼容性问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读