XmlSerializer.UnreferencedObject イベント
アセンブリ: System.Xml (system.xml.dll 内)

Dim instance As XmlSerializer Dim handler As UnreferencedObjectEventHandler AddHandler instance.UnreferencedObject, handler
public: event UnreferencedObjectEventHandler^ UnreferencedObject { void add (UnreferencedObjectEventHandler^ value); void remove (UnreferencedObjectEventHandler^ value); }

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" 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 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 要素型に対応するクラス メンバが存在しないときに発生します。

UnreferencedObjectEventHandler を XmlSerializer に追加する例を次に示します。イベントは、Serializer_UnreferencedObject メソッドによって処理されます。このサンプル コードを実行するには、"UnrefObj.xml" という名前のファイルに、次の XML を切り取って貼り付けます。
<wrapper> <Group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" n1:GroupName=".NET" xmlns:n1="http://www.cpandl.com"> </Group> <Vehicle 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 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>
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>
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>
#using <System.Xml.dll> #using <System.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; ref class Vehicle; [SoapInclude(Vehicle::typeid)] public ref class Vehicle { public: String^ licenseNumber; }; // You must use the SoapIncludeAttribute to inform the XmlSerializer // that the Vehicle type should be recognized when deserializing. [SoapInclude(Vehicle::typeid)] public ref class Group { public: String^ GroupName; Vehicle^ GroupVehicle; }; public ref class Run { public: void DeserializeObject( String^ filename ) { // Create an instance of the XmlSerializer class. XmlTypeMapping^ myMapping = ((gcnew SoapReflectionImporter)->ImportTypeMapping( Group::typeid )); XmlSerializer^ mySerializer = gcnew XmlSerializer( myMapping ); mySerializer->UnreferencedObject += gcnew UnreferencedObjectEventHandler( this, &Run::Serializer_UnreferencedObject ); // Reading the file requires an XmlTextReader. XmlTextReader^ reader = gcnew 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( "UnreferencedObject:" ); Console::WriteLine( "ID: {0}", e->UnreferencedId ); Console::WriteLine( "UnreferencedObject: {0}", e->UnreferencedObject ); Vehicle^ myVehicle = dynamic_cast<Vehicle^>(e->UnreferencedObject); Console::WriteLine( "License: {0}", myVehicle->licenseNumber ); } }; int main() { Run^ test = gcnew Run; test->DeserializeObject( "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>
import System.*; import System.IO.*; import System.Text.*; import System.Xml.*; import System.Xml.Serialization.*; import System.Xml.Schema.*; // You must use the SoapIncludeAttribute to inform the XmlSerializer // that the Vehicle type should be recognized when deserializing. /** @attribute SoapInclude(Vehicle.class) */ public class Group { public String groupName; public Vehicle groupVehicle; } //Group /** @attribute SoapInclude(Vehicle.class) */ public class Vehicle { public String licenseNumber; } //Vehicle public class Run { public static void main(String[] args) { Run test = new Run(); test.DeserializeObject("UnrefObj.xml"); } //main public void DeserializeObject(String fileName) { // Create an instance of the XmlSerializer class. XmlTypeMapping myMapping = (new SoapReflectionImporter()). ImportTypeMapping(Group.class.ToType()); XmlSerializer mySerializer = new XmlSerializer(myMapping); mySerializer.add_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(); } //DeserializeObject private void Serializer_UnreferencedObject(Object sender, UnreferencedObjectEventArgs e) { Console.WriteLine("UnreferencedObject:"); Console.WriteLine("ID: " + e.get_UnreferencedId()); Console.WriteLine("UnreferencedObject: " + e.get_UnreferencedObject()); Vehicle myVehicle = (Vehicle)e.get_UnreferencedObject(); Console.WriteLine("License: " + myVehicle.licenseNumber); } //Serializer_UnreferencedObject } //Run // 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>

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- XmlSerializer.UnreferencedObject イベントのページへのリンク