次の方法で共有


XmlSerializer.UnreferencedObject イベント

SOAP エンコード済み XML ストリームの逆シリアル化時に、 XmlSerializer が未使用の (参照されていない) 型を認識した場合に発生します。

Public Event UnreferencedObject As UnreferencedObjectEventHandler
[C#]
public event UnreferencedObjectEventHandler UnreferencedObject;
[C++]
public: __event UnreferencedObjectEventHandler* UnreferencedObject;

[JScript] JScript では、このクラスで定義されているイベントを処理できます。ただし、独自に定義することはできません。

イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、UnreferencedObjectEventArgs 型の引数を受け取りました。次の UnreferencedObjectEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ 説明
UnreferencedId オブジェクトの ID を取得します。
UnreferencedObject 逆シリアル化された、未参照のオブジェクトを取得します。

解説

UnreferencedObject イベントは、 XmlSerializer を使用して、W3C (World Wide Web Consortium) (www.w3.org) のドキュメント『Simple Object Access Protocol (SOAP) 1.1』のセクション 5 に準拠する SOAP メッセージが含まれている XML ドキュメントを逆シリアル化する場合にだけ発生します。

セクション 5 に準拠するドキュメントは、特別な形式のドキュメントです。このようなドキュメントには、少なくとも SOAP メッセージの本文が含まれています。しかし、すべての型がこのようなドキュメント内でインラインで定義されているのではなく、一部の型定義がドキュメント内の最上位要素への参照としてエンコードされている場合もあります。したがって、本文内にある要素のうち、このような参照である要素については、それぞれの型定義を含む対応した要素が存在している必要があります。参照側の要素とその型定義に相関関係を持たせるには、一意の文字列 ID が設定された id 属性を型定義に適用し、参照側の要素には、同じ ID を参照する href 属性を適用します。

<Group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="id1" n1:GroupName=".NET" GroupNumber="ZDI=" CreationDate="2002-05-02" xmlns:n1="http:'www.cpandl.com">
    <PosInt xsi:type="xsd:nonNegativeInteger">10000</PosInt>
    <GroupVehicle href="#id2" />
  </Group>
  <Vehicle id="id2" n1:type="Vehicle" xmlns:n1="http://www.w3.org/2001/XMLSchema-instance">
    <licenseNumber xmlns:q1="http://www.w3.org/2001/XMLSchema" n1:type="q1:string">1234</licenseNumber>
  </Vehicle>

つまり、 UnreferencedObject イベントは、ドキュメント内に型定義はあるが、その定義を参照するパラメータが本文内にない場合に発生します。このイベントが発生した場合は、 UnreferencedObjectEventArgs クラスの UnreferencedObject プロパティを調べることによって、未参照のオブジェクトの XML 型を取得できます。 UnreferencedId プロパティによって返される、オブジェクトの XML ID。

UnreferencedObject イベントを UnknownElement イベントや UnknownNode イベントと混同しないようにしてください。これらのイベントは、XML ノード型や XML 要素型に対応するクラス メンバが存在しないときに発生します。

使用例

[Visual Basic, C#, C++] UnreferencedObjectEventHandlerXmlSerializer に追加する例を次に示します。イベントは、 Serializer_UnreferencedObject メソッドによって処理されます。このサンプル コードを実行するには、UnrefObj.xml という名前のファイルに、次の XML を切り取って貼り付けます。

 
Imports System
Imports System.IO
Imports System.Text
Imports System.Xml
Imports System.Xml.Serialization
Imports System.Xml.Schema

' You must use the SoapIncludeAttribute to inform the XmlSerializer
' that the Vehicle type should be recognized when deserializing.
<SoapInclude(GetType(Vehicle))> _
Public Class Group
    Public GroupName As String 
   public GroupVehicle As Vehicle 
End Class

Public Class Vehicle
   Public licenseNumber As String 
End Class

 
Public Class Run
   Shared Sub Main()
      Dim test As Run = new Run()
      test.DeserializeObject("UnrefObj.xml")
   End Sub
   
   Public Sub DeserializeObject(filename As String)
      ' Create an instance of the XmlSerializer class.
      Dim myMapping As XmlTypeMapping = _
      (new SoapReflectionImporter().ImportTypeMapping _
      (GetType(Group)))
      Dim mySerializer As XmlSerializer =  _
      new XmlSerializer(myMapping)

      AddHandler mySerializer.UnreferencedObject, _
      AddressOf Serializer_UnreferencedObject

      ' Reading the file requires an  XmlTextReader.
      Dim reader As XmlTextReader = _
      new XmlTextReader(filename)
      reader.ReadStartElement()

      ' Deserialize and cast the object.
      Dim myGroup As Group  
      myGroup = CType( mySerializer.Deserialize(reader), Group)
      reader.ReadEndElement()
      reader.Close()
   End Sub
   
   Private Sub Serializer_UnreferencedObject _
   (sender As object , e As UnreferencedObjectEventArgs)
      Console.WriteLine("UnreferencedObject:")
      Console.WriteLine("ID: " + e.UnreferencedId)
      Console.WriteLine("UnreferencedObject: " + e.UnreferencedObject)
      Dim myVehicle As Vehicle = CType(e.UnreferencedObject, Vehicle)
      Console.WriteLine("License: " + myVehicle.licenseNumber)
       End Sub
 End Class
 
' The XML document should contain this information:

'<wrapper>

'  <Group xmlns:xsi="http:'www.w3.org/2001/XMLSchema-instance" 
'xmlns:xsd="http:'www.w3.org/2001/XMLSchema" id="id1" 
'n1:GroupName=".NET" xmlns:n1="http:'www.cpandl.com">
'   </Group>

'<Vehicle id="id2" n1:type="Vehicle" 
'xmlns:n1="http:'www.w3.org/2001/XMLSchema-instance">
'    <licenseNumber xmlns:q1="http:'www.w3.org/2001/XMLSchema" 
'n1:type="q1:string">ABCD</licenseNumber>
'  </Vehicle>

'<Vehicle id="id3" n1:type="Vehicle" 
'xmlns:n1="http:'www.w3.org/2001/XMLSchema-instance">
'    <licenseNumber xmlns:q1="http:'www.w3.org/2001/XMLSchema" 
'n1:type="q1:string">1234</licenseNumber>
'  </Vehicle>

'</wrapper>


[C#] 
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;

// You must use the SoapIncludeAttribute to inform the XmlSerializer
// that the Vehicle type should be recognized when deserializing.
[SoapInclude(typeof(Vehicle))]
public class Group
{
   public string GroupName;
   public Vehicle GroupVehicle;
}
 [SoapInclude(typeof(Vehicle))]
public class Vehicle
{
   public string licenseNumber;
}

public class Run
{
   public static void Main()
   {
      Run test = new Run();
      test.DeserializeObject("UnrefObj.xml");
   }
   
   public void DeserializeObject(string filename)
   {
      // Create an instance of the XmlSerializer class.
      XmlTypeMapping myMapping = 
      (new SoapReflectionImporter().ImportTypeMapping(
      typeof(Group)));
      XmlSerializer mySerializer =  
      new XmlSerializer(myMapping);
 
      mySerializer.UnreferencedObject += 
      new UnreferencedObjectEventHandler
      (Serializer_UnreferencedObject);

      // Reading the file requires an  XmlTextReader.
      XmlTextReader reader= 
      new XmlTextReader(filename);
      reader.ReadStartElement();

      // Deserialize and cast the object.
      Group myGroup; 
      myGroup = (Group) mySerializer.Deserialize(reader);
      reader.ReadEndElement();
      reader.Close();
   }

   private void Serializer_UnreferencedObject
   (object sender, UnreferencedObjectEventArgs e){
      Console.WriteLine("UnreferencedObject:");
      Console.WriteLine("ID: " + e.UnreferencedId);
      Console.WriteLine("UnreferencedObject: " + e.UnreferencedObject);
      Vehicle myVehicle = (Vehicle) e.UnreferencedObject;
      Console.WriteLine("License: " + myVehicle.licenseNumber);
   }
}

// The file named "UnrefObj.xml" should contain this XML:

// <wrapper>

//  <Group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
//xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="id1" 
//n1:GroupName=".NET" xmlns:n1="http://www.cpandl.com">
//   </Group>

//<Vehicle id="id2" n1:type="Vehicle" 
//xmlns:n1="http://www.w3.org/2001/XMLSchema-instance">
//   <licenseNumber xmlns:q1="http://www.w3.org/2001/XMLSchema" 
//n1:type="q1:string">ABCD</licenseNumber>
//   </Vehicle>

//<Vehicle id="id3" n1:type="Vehicle" 
//xmlns:n1="http://www.w3.org/2001/XMLSchema-instance">
//    <licenseNumber xmlns:q1="http://www.w3.org/2001/XMLSchema" 
//n1:type="q1:string">1234</licenseNumber>
//  </Vehicle>

//</wrapper>


[C++] 
#using <mscorlib.dll>
#using <System.Xml.dll>
using namespace System;
using namespace System::IO;
using namespace System::Text;
using namespace System::Xml;
using namespace System::Xml::Serialization;
using namespace System::Xml::Schema;

__gc public class Vehicle;
[SoapInclude(__typeof(Vehicle))]
__gc public class Vehicle
{
public:
   String* licenseNumber;
};

// You must use the SoapIncludeAttribute to inform the XmlSerializer
// that the Vehicle type should be recognized when deserializing.
[SoapInclude(__typeof(Vehicle))]
__gc public class Group
{
public:
   String* GroupName;
   Vehicle * GroupVehicle;
};

__gc public class Run 
{
public:
   void DeserializeObject(String* filename) 
   {
      // Create an instance of the XmlSerializer class.
      XmlTypeMapping * myMapping = 
         ((new SoapReflectionImporter()) -> ImportTypeMapping(__typeof(Group)));
      XmlSerializer* mySerializer = new XmlSerializer(myMapping);

      mySerializer -> UnreferencedObject += new UnreferencedObjectEventHandler
         (this, &Run::Serializer_UnreferencedObject);

      // Reading the file requires an  XmlTextReader.
      XmlTextReader* reader = new XmlTextReader(filename);
      reader -> ReadStartElement();

      // Deserialize and cast the object.
      Group * myGroup; 
      myGroup = dynamic_cast<Group*>(mySerializer -> Deserialize(reader));
      reader -> ReadEndElement();
      reader -> Close();
   }

private:
   void Serializer_UnreferencedObject(Object* /*sender*/, UnreferencedObjectEventArgs * e) 
   {
      Console::WriteLine(S"UnreferencedObject:");
      Console::WriteLine(S"ID: {0}", e -> UnreferencedId);
      Console::WriteLine(S"UnreferencedObject: {0}", e -> UnreferencedObject);
      Vehicle * myVehicle = dynamic_cast<Vehicle*>(e -> UnreferencedObject);
      Console::WriteLine(S"License: {0}", myVehicle -> licenseNumber);
   }
};

int main() 
{
   Run* test = new Run();
   test -> DeserializeObject(S"UnrefObj.xml");
}


// The file named S"UnrefObj.xml" should contain this XML:

// <wrapper>

//  <Group xmlns:xsi=S"http://www.w3.org/2001/XMLSchema-instance" 
//xmlns:xsd=S"http://www.w3.org/2001/XMLSchema" id=S"id1" 
//n1:GroupName=S".NET" xmlns:n1=S"http://www.cpandl.com">
//   </Group>

//<Vehicle id=S"id2" n1:type=S"Vehicle" 
//xmlns:n1=S"http://www.w3.org/2001/XMLSchema-instance">
//   <licenseNumber xmlns:q1=S"http://www.w3.org/2001/XMLSchema" 
//n1:type=S"q1:String*">ABCD</licenseNumber>
//   </Vehicle>

//<Vehicle id=S"id3" n1:type=S"Vehicle" 
//xmlns:n1=S"http://www.w3.org/2001/XMLSchema-instance">
//    <licenseNumber xmlns:q1=S"http://www.w3.org/2001/XMLSchema" 
//n1:type=S"q1:String*">1234</licenseNumber>
//  </Vehicle>

//</wrapper>

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

XmlSerializer クラス | XmlSerializer メンバ | System.Xml.Serialization 名前空間 | エンコード済み SOAP シリアル化を制御する属性 | XML シリアル化を使用した SOAP メッセージの生成 | XML シリアル化の概要 | 属性を使用した XML シリアル化の制御 | XML シリアル化の例 | XML スキーマ定義ツールと XML シリアル化