3

私は次のように定義されたプロパティを持っています:

[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
 XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }

List<>Deleteにアイテムがない場合

<delete />

放出されます。List<>Deleteがnullに設定されている場合

<delete xsi:nil="true" />

放出されます。コレクションにアイテムがない場合に、属性を使用して削除要素が発行されないようにする方法はありますか?

グレッグ-完全に感謝します。IsNullableのドキュメントを読んでいませんでした。

Rob Cooper -ISerializableを避けようとしていましたが、Gregsの提案は機能します。(1)で概説した問題に遭遇しました。コレクションの長さがゼロの場合、nullを返すだけで、大量のコードを壊しました。これを回避するために、EventsBuilderクラス(シリアル化するクラスはEventsと呼ばれます)を作成しました。このクラスは、Eventsクラスをシリアル化のために吐き出すEventsクラスの基になるオブジェクトのすべてのライフタイム/作成を管理します。

4

4 に答える 4

19

フィールドが空または 0 の場合に要素を出力したくないという同じ問題がありました。XML 出力では xsi:null="true" (設計による) を使用できませんでした。

制御したいフィールドと同じ名前の bool 型のプロパティに「Specified」を追加すると、XMLSerializer はこのプロパティの戻り値をチェックして、対応するフィールドが含まれています。

IXMLSerializer を実装せずにこれを実現するには:

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}
于 2009-05-01T11:26:14.877 に答える
5

IsNullable = falseを設定するか、単に削除した場合(デフォルトではfalse)、「delete」要素は発行されません。これは、コレクションがnullに等しい場合にのみ機能します。

私の推測では、.NETに関する「null可能性」とXMLのnull可能要素に関連する要素(xml:nil属性でマークされている要素)の間には混乱があります。XmlArrayAttribute.IsNullableプロパティは後者を制御します。

于 2008-09-16T04:34:48.410 に答える
1

まず、「シリアライゼーションとは何ですか?」と自問してください。

XmlSerializerは、オブジェクトの現在の状態を XML に永続化して、本来の処理を正確に実行しています。リストを初期化すると初期化されるため、現在の動作が「正しくない」理由がわかりません。

ここには3つのオプションがあると思います:

  1. コレクションに項目がない場合に null を返すコードを Getter に追加します。ただし、これにより、他のコードが台無しになる可能性があります。
  2. IXmlSerializableインターフェイスを実装し、すべての作業を自分で行います。
  3. これが一般的なプロセスである場合は、私の質問「XML Serialization and Inherited Types」を参照してください。はい、別の問題を扱っていることは知っていますが、汎用の中間シリアル化クラスを作成する方法を示しています。 serilization プロセスをカプセル化できるように「ボルトオン」。同様のクラスを作成して、null/ゼロ項目コレクションのデフォルト プロセスのオーバーライドに対処できます。

これが役立つことを願っています。

于 2008-09-16T05:02:24.520 に答える
0

いつでもIXmlSerializerを実装し、手動でシリアル化を実行できます。

例については、 http://www.codeproject.com/KB/cs/IXmlSerializable.aspxを参照してください。

于 2008-09-16T04:07:31.237 に答える