3

少しイライラする問題があります。C#(.NET 3.5)でxmlを逆シリアル化するときにデフォルト値を設定することは可能ですか?基本的に、私は自分の制御下にないいくつかのxmlを逆シリアル化しようとしていますが、1つの要素は次のようになります。

<assignee-id type="integer">38628</assignee-id>

また、次のようになります。

<assignee-id type="integer" nil="true"></assignee-id>

今、私のクラスには、データを受け取る必要がある次のプロパティがあります。

[XmlElementAttribute("assignee-id")]
public int AssigneeId { get; set; }

これは最初のxml要素の例では正常に機能しますが、2番目の例では失敗します。プロパティタイプをintに変更してみましたか?しかし、これは役に立ちません。ある時点で同じxml形式にシリアル化する必要もありますが、独自のロールに頼ることなく、組み込みのシリアル化サポートを使用しようとしています。

誰かがこの種の問題の経験がありますか?

4

3 に答える 3

3

ソース XML は xsi:type と xsi:nil を使用しているようですが、それらに名前空間のプレフィックスを付けていません。

あなたができることは、これらを XSLT で処理してこれを有効にすることです。

<assignees>
  <assignee>
    <assignee-id type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id type="integer" nil="true"></assignee-id>
  </assignee>
</assignees>

これに:

<assignees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <assignee>
    <assignee-id xsi:type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id xsi:type="integer" xsi:nil="true" />
  </assignee>
</assignees>

これは、カスタム コードを必要とせずに、XmlSerializer によって正しく処理されます。このための XSLT はかなり簡単で、楽しい練習になります。多くの「コピー」XSLT サンプルの 1 つから始めて、単に「type」および「nil」属性のテンプレートを追加して、名前空間属性を出力します。

必要に応じて、XML ドキュメントをメモリにロードして属性を変更することもできますが、XSLT エンジンはパフォーマンスのために調整されており、非常に大きなファイルを完全にメモリにロードしなくても処理できるため、これはお勧めできません。

于 2008-10-11T08:57:53.203 に答える
2

OnDeserializedAttribute 、OnSerializingAttributeOnSerializedAttribute、およびOnDeserializingAttributeを調べて、シリアル化プロセスにカスタム ロジックを追加することをお勧めします。

于 2008-10-10T22:13:21.367 に答える
1

XmlSerializer は xsi:nil を使用するため、これにはカスタム IXmlSerializable シリアライゼーションを行う必要があると思います。ごめん。

于 2008-10-10T22:07:23.563 に答える