2013-11-14 64 views
20

私はコードベースを調べましたが、私たちのDTOには[DataMember][IgnoreDataMember]の属性が混在しています。[DataMember]属性と[IgnoreDataMember]属性を持つ属性がありません

以前は、DTOのシリアル化を望まない場合は、[DataMember]という属性を追加しないでください。それから私は他の属性を見て、いくつかの掘り下げをしました。これは、プロパティがシリアル化されないことを明示的に示しているようです。

今、私の質問は良いですか? [IgnoreDataMember]を追加するか、何も追加しないでください。

私は尋ねたことがあります。[IgnoreDataMember]は、すべてがシリアル化され、無視する必要がある(私は.Net 2を信じています)ことを指示しなければならない日であると思われます。その後、彼らはそれを逆に変更し、明示的にSHOULDをシリアル化する必要があります。今、あなたは両方を行うことができるようです。

答えて

37

私の周り求めていると、すべてがシリアル化された、あなたは(私はネット2を信じて)無視されるべきかを指示するために持っていたとき[IgnoreDataMember]日からのようです。その後、彼らはそれを逆に変更し、明示的にSHOULDをシリアル化する必要があります。

実際はそうではありません。 IIRC、それは常に両方されています:それは[DataContract]としてマークされている場合

  • 、そして唯一のメンバーは[DataMember]が、それは[DataContract]としてマークされないであれば、それはすべてデフォルトその後、
  • 考えられるが、次のことができているマーク[IgnoreDataMember]

を使用して減算メンバーは、私は通常ちょうど私がシリアライズさたいが、多くの点でないものの[DataMember]を省略[IgnoreDataMember]はより明示的です - 主にメンテナのためです。 「これはシリアル化されていないことがわかっているかもしれませんが、属性を追加するのを忘れていた可能性があります」というよりも、「意図的にこれをシリアル化していません」と言います。

いずれも機能します。

+3

また、MSによると: "IgnoreDataMemberAttribute属性はマークされていないタイプで使用された場合にのみ適用されます。同じクラスで '[DataContract]'と '[IgnoreDataMember]'を使うと、後者は無視されます。 –

+2

@MichaelEdenfieldがペタンティックであるために、 'DataContractSerializer'はデフォルトで全てのパブリックフィールドとプロパティ*(パブリックフィールドは非常にまれです)。それは少しでもあいまいです。たとえば、 'NetDataContractSerializer'について言うと、デフォルトでは*すべてのフィールド*(publicとprivate)になりますが、プロパティはありません。 –

+1

私はそれが古いスレッドだと知っていますが、昨日、Edenfieldそう正確にそうではありません。 私は1つのフィールドと4つのプロパティを持つクラスを持っています。 4つのプロパティはすべて、何らかの形式のデータ(バイト配列、文字列など)を変換し、それを1つのフィールドに書き込みます。私はクラスにDataContract属性を付けて、そのフィールドだけをDataMemberとしてマークしました。しかし、この方法では、デシリアライザはプロパティを無視せず、デフォルト値(フィールドを上書きする)に設定しました。プロパティに[IgnoreDataMember]を追加すると、問題が修正されました。だから無視されない –

関連する問題