5

これで「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

私のasp webapiプロジェクトのデフォルトのシリアル化について、「見栄えが悪い」「d3p1が変更されたらどうなるか」というコメントをたくさん受け取りました。私はそれが機械可読であると言います。でもなんでこんな形なのか気になります。

詳細は次のとおりです。コントローラーにGET動詞があり、列挙可能なのを返しますActionMessage

 public IEnumerable<ActionMessage> Get(Guid)

ActionMessageリストにはさまざまなジェネリック タイプのアクション メッセージが含まれるため、ジェネリックにすることはできません (それが役立つ場合でも)。「新契約」、「鍵変更」など。

ActionMessage<NewAgreement>orなどのように見えますActionMessage<KeyChange>。get は多くの「タイプ」のアクション メッセージを返すため、get でこれを行う方法はありません。基本クラスまたはインターフェイスの外。IEActionMessage<IMessage>ですが、これらのメッセージには共通点がありません。

アクション メッセージは次のようになります。

 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 を完全に制御することはできますが、本当に必要なのか、それとも気にする必要があるのでしょうか?

4

1 に答える 1

4

これにたくさん取り組んだ結果、データ コントラクトをできるだけ明示することが一般的に最善であるという結論に達しました。この場合List<object> Data、複数の明示的なリストに分割しますList<Agreement> AgreementsList<KeyChange> KeyChanges; 等々。結果の XML は次のようになります。

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

一部の要素は空になります (これらを省略するようにシリアライザーを構成できます) が、それぞれが明示的であり、読み取り、解析、および逆シリアル化が容易です。さらに重要なことは、スキーマの利用者が何を期待すべきかを正確に知っていることです。

もう 1 つのオプションがあります。それAgreementは、KeyChange、 などをすべて実装し (「IData」など)、 に変更できる何らかの種類のインターフェイスを定義するList<object> DataことList<IData> Dataです。XML ドキュメントは少しきれいになりますが、既知の型のリストを維持して、すべての実装を逆シリアル化できるようにする必要があります。XML は次のようになります。

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

ただし、これによりデシリアライゼーションが脆弱になり、メッセージの前方/後方互換性に問題が生じる可能性があります。

于 2013-06-05T19:00:00.100 に答える