4

私はいくつかの単純な POCO オブジェクトを持っています:

public class ProductCategoryDTO
{
        public string Name { get; set; }
        public DateTime ModifiedDate { get; set; }
}

フィールドの順序が重要な場合があるため (たとえば、Infopath フォームに送信する場合)、シリアル化するときに要素の順序を維持する必要があります。

そして今、クラスと各フィールドにどの属性を使用すればよいか、混乱しています。そんなこと知ってる:

  • DataContractSerializer は [DataContract] と [DataMember(Order = n)] を使用します
  • XMLSerializer は [Serializable] と [XmlElementAttribute(Order = n)] を使用します。

次に、XMLSerializer と DataContractSerializer の両方をサポートして、WCF または ASP の両方で使用できるようにする場合に使用する属性を指定します。ウェブサービス?

4

3 に答える 3

6

厳密に言えば、どちらにも属性を使用する必要はありません; -p以前は/DataContractSerializerを要求するものでしたが(絶対に使用する必要があります)、使用せずに使用できます(ただし、非常に疑わしい方法で動作します)に似ています)。同様に、物事を制御したいのでなければ、何も必要ありません。ただし、注意すべきいくつかの違いがあります。[DataContract][DataMember]BinaryFormatterXmlSerializer

  • XmlSerializerパブリックパラメーターレスコンストラクターを要求(および使用)します。DataContractSerializer コンストラクターを使用しません(まったく)。したがって、それに注意し、(WCFの場合)ctorのコードに依存しないでください。必要な初期化コードがある場合は、WCFのシリアル化コールバックを使用してください。
  • XmlSerializerパブリックフィールド(yeuch)またはと(リストの場合でも)の両方を持つパブリックプロパティのいずれかを要求getsetます。DataContractSerializerプライベートメンバー、(たとえば)パブリックgetとプライベートのあるプロパティ、および `セットのないsetコレクション(タイプが初期化する限り)に対してうまく機能します。
  • XmlSerializerパブリックタイプを要求します。IIRCDataContractSerializerはそれほどうるさくない

あ、はい; 両方のシリアライザーをサポートでき、任意の数の属性を並行して追加できますが、完全な互換性が必要な場合は上記に注意してください。

もう1つのオプションは、XmlSerializer;を使用することです。XmlSerializerを使用して、使用するWCFを構成できます[XmlSerialzerFormat][XmlInclude]どちらのオプションも、とを介して継承をサポートします[KnownType]

最後に、を実装する場合IXmlSerializable、これはどちらよりも優先されますが、正しく理解するのは難しいことに注意してください。必要がない限り、そうしないでください。

于 2009-12-19T18:39:59.637 に答える
3

本当に必要な場合に、クラスプロパティとメンバープロパティの両方に属性を設定できなかった理由はわかりません。見栄えは良くありませんが、うまくいくのであれば、それで問題ありません。

[DataContract(Namespace="....")]
[XmlType]
public class ProductCategoryDTO
{
        [DataMember(Order=1)]
        [XmlElementAttribute(Order=1)]
        public string Name { get; set; }

        [DataMember(Order=2)]
        [XmlElementAttribute(Order=2)]
        public DateTime ModifiedDate { get; set; }
}
于 2009-12-19T17:06:04.963 に答える
1

XML 要素の順序は WSDL によって決定される必要があり、心配する必要はありません。.NET 3.5 SP1 以降では、 DataContractAttributeDataMemberAttributeを使用する必要がなくなりました。シリアライザーには、すべてのパブリック プロパティが自動的に含まれます。XmlSerializerに関する限り、SerializableAttributeは効果がありません。この属性は、BinaryFormatterによるバイナリのシリアル化に使用されます。したがって、再開するには、クラスを POCO のままにして、WCF または ASP.NET Web サービスで公開し、クライアントが WSDL に従ってそれを消費するようにすることができます。

于 2009-12-19T16:35:20.157 に答える