XmlSerializer.UnreferencedObject XmlSerializer.UnreferencedObject XmlSerializer.UnreferencedObject XmlSerializer.UnreferencedObject Event


在 SOAP 編碼的 XML 資料流還原序列化期間,XmlSerializer 遇到未使用 (未參考) 的可辨認型別時發生。Occurs during deserialization of a SOAP-encoded XML stream, when the XmlSerializer encounters a recognized type that is not used or is unreferenced.

 event System::Xml::Serialization::UnreferencedObjectEventHandler ^ UnreferencedObject;
public event System.Xml.Serialization.UnreferencedObjectEventHandler UnreferencedObject;
member this.UnreferencedObject : System.Xml.Serialization.UnreferencedObjectEventHandler 
Public Custom Event UnreferencedObject As UnreferencedObjectEventHandler 


下列範例會將UnreferencedObjectEventHandlerXmlSerializerThe following example adds an UnreferencedObjectEventHandler to an XmlSerializer. 事件由處理Serializer``_``UnreferencedObject方法。The event is handled by the Serializer``_``UnreferencedObject method. 要執行範例,剪下並貼入名為"UnrefObj.xml"的檔案中的下列 XML 程式碼。To run the example, cut and paste the following XML into a file named "UnrefObj.xml".

  <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">  
<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 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>  
#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;

public ref class Vehicle
   String^ licenseNumber;

// You must use the SoapIncludeAttribute to inform the XmlSerializer
// that the Vehicle type should be recognized when deserializing.

public ref class Group
   String^ GroupName;
   Vehicle^ GroupVehicle;

public ref class Run
   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 );
      // Deserialize and cast the object.
      Group^ myGroup;
      myGroup = dynamic_cast<Group^>(mySerializer->Deserialize( reader ));

   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:
//  <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">
//<Vehicle id=S"id2" n1:type=S"Vehicle" 
//   <licenseNumber xmlns:q1=S"http://www.w3.org/2001/XMLSchema" 
//<Vehicle id=S"id3" n1:type=S"Vehicle" 
//    <licenseNumber xmlns:q1=S"http://www.w3.org/2001/XMLSchema" 
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.
public class Group
   public string GroupName;
   public Vehicle GroupVehicle;
public class Vehicle
   public string licenseNumber;

public class Run
   public static void Main()
      Run test = new Run();
   public void DeserializeObject(string filename)
      // Create an instance of the XmlSerializer class.
      XmlTypeMapping myMapping = 
      (new SoapReflectionImporter().ImportTypeMapping(
      XmlSerializer mySerializer =  
      new XmlSerializer(myMapping);
      mySerializer.UnreferencedObject += 
      new UnreferencedObjectEventHandler

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

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

   private void Serializer_UnreferencedObject
   (object sender, UnreferencedObjectEventArgs e){
      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:

//  <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">

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

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

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()
   End Sub
   Public Sub DeserializeObject(filename As String)
      ' Create an instance of the XmlSerializer class.
      Dim myMapping As XmlTypeMapping = _
      (new SoapReflectionImporter().ImportTypeMapping _
      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)

      ' Deserialize and cast the object.
      Dim myGroup As Group  
      myGroup = CType( mySerializer.Deserialize(reader), Group)
   End Sub
   Private Sub Serializer_UnreferencedObject _
   (sender As object , e As UnreferencedObjectEventArgs)
      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:

'  <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">

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

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


UnreferencedObject才會發生事件時XmlSerializer用來還原序列化 XML 文件,其中包含 SOAP 訊息,以符合全球資訊網協會文件中,第 5 節簡易物件存取通訊協定 (SOAP) 1.1.The UnreferencedObject event only occurs when the XmlSerializer is used to deserialize an XML document that contains a SOAP message that conforms to section 5 of the World Wide Web Consortium document, Simple Object Access Protocol (SOAP) 1.1.

遵循第 5 節的文件是以特殊格式。Documents that conform to section 5 are in a special format. 最起碼,這類文件會包含 SOAP 訊息的主體。At the very least, such a document includes the main body of the SOAP message. 不過,而不是所有型別定義內嵌文件中,某些型別定義可以編碼為文件中的最上層項目參考。However, rather than having all types defined inline in the document, some type definitions can be encoded as references to top-level elements in the document. 因此,對於所參考的主要本文中找到每個項目,必須有對應的項目,其中包含的型別定義。Thus, for every element found in the main body that is a reference, there must be a corresponding element that contains the type definition. 若要將建立相互關聯之參考項目的類型定義,具有型別定義id屬性設定為唯一字串識別碼和參考的項目已href屬性會參考相同的識別碼。To correlate the referencing element and the type definition, the type definition has an id attribute set to a unique string ID and the referencing element has an href attribute that references the same ID.

<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" />  
  <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>  

UnreferencedObject事件發生時,文件中找到的類型定義但沒有主體中的參數會參考它。The UnreferencedObject event occur when there is a type definition found in the document, but no parameter in the main body references it. 發生事件時,您可以藉由檢查擷取的未參考物件的 XML 型別UnreferencedObject屬性UnreferencedObjectEventArgs類別。When the event occurs, you can retrieve the XML type of the unreferenced object by examining the UnreferencedObject property of the UnreferencedObjectEventArgs class. 物件的 XML 識別碼由UnreferencedId屬性。The XML ID of the object is returned by the UnreferencedId property.

UnreferencedObject事件不應該與混淆UnknownElementUnknownNode沒有對應到 XML 節點或項目類型的類別成員時,發生的事件。The UnreferencedObject event should not be confused with the UnknownElement and UnknownNode events, which occur when there is no class member that corresponds to the XML node or element type.