1

IXmlSerializableを使用して、特定のタイプの要素を送信xmlに書き込んでいます。スキーマを実装し、項目を書き出しています。次のコードは例です。

public void IXmlSerializable.WriteXml(XmlWriter writer) {
  // Write Out Class.
  foreach (var item in myItems) {
    DataContractSerializer ds = new DataContractSerializer(typeof(MyType));
    ds.WriteObject(writer, item);
  }
}

私が抱えている問題は、MyTypeが参照を使用するものとして宣言されていることです

[DataContract(IsReference = true)]
public class MyType { ...

したがって、アイテムがすでにxmlに書き込まれている場合は、参照である必要があります。

参照がすでにxmlに書き込まれているかどうかを確認するにはどうすればよいですか?私は、私が明示的に管理していない参照を無視しなければならないと考えています。そうすれば、自分の参照IDを作成し、自分のインスタンスを参照します。

複製してはならない参照を複製しているので、これは明らかに悪いハッキングされた妥協案です。

すでにシリアル化されているアイテムのIDを見つけることができるかどうかを確認するために、すでに書き込まれているものを見つける方法はありますか?

よろしく

クレイグ。

4

1 に答える 1

0

「IsReference」マジックは、単一の「エピソード」内のシリアル化に対してのみ機能します。エピソードは、単一のWriteObject呼び出しです。

以下のように、あるトップレベルタイプのトップレベルオブジェクトがあるとしましょう。

[DC]    
class Container
    {
      [DM]
      MyType i1 = new MyType();
      [DM]
      MyType i2 = i1;;
      [DM]
      MyType i3 = i1;
    }

ここで、WriteObjectの呼び出しを介してContainerのインスタンスをシリアル化する場合、それは「ids」と「refs」が機能するときです。i1がシリアル化されると、ID 1でシリアル化されますが、i2とi3がシリアル化されると、それぞれがMyTypeのID1を指す「REF」属性でシリアル化されます。

この例では、WriteObjectのすべての呼び出しは個別のエピソードであるため、各呼び出しはオブジェクトグラフ全体をシリアル化します。さまざまなMyTypeインスタンスをすべて上位レベルのオブジェクト(またはコレクション)にパッケージ化できない限り、運が悪いことになります。つまり、これを行う必要があります。基本的に、MyTypeのすべてのインスタンスを単一の上位レベルのWriteObject呼び出し内でシリアル化するように強制します。

于 2012-04-27T13:40:19.180 に答える