Auf Englisch lesen

Freigeben über


XmlSerializer.UnreferencedObject Ereignis

Definition

Tritt während der Deserialisierung eines SOAP-codierten XML-Streams ein, wenn XmlSerializer auf einen bekannten Typ stößt, der nicht verwendet wird oder auf den nicht verwiesen wird.

C#
public event System.Xml.Serialization.UnreferencedObjectEventHandler UnreferencedObject;

Ereignistyp

Beispiele

Im folgenden Beispiel wird einer UnreferencedObjectEventHandlerXmlSerializerhinzugefügt. Das Ereignis wird von der Serializer``_``UnreferencedObject -Methode behandelt. Um das Beispiel auszuführen, schneiden Sie den folgenden XML-Code aus, und fügen Sie ihn in eine Datei mit dem Namen "UnrefObj.xml" ein.

<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:


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

Hinweise

Das UnreferencedObject Ereignis tritt nur auf, wenn zum XmlSerializer Deserialisieren eines XML-Dokuments verwendet wird, das eine SOAP-Nachricht enthält, die abschnitt 5 des World Wide Web Consortium-Dokuments , Simple Object Access Protocol (SOAP) 1.1 entspricht.

Dokumente, die abschnitt 5 entsprechen, haben ein spezielles Format. Zumindest enthält ein solches Dokument den Standard Textkörper der SOAP-Nachricht. Anstatt jedoch alle Typen im Dokument inline zu definieren, können einige Typdefinitionen als Verweise auf Elemente der obersten Ebene im Dokument codiert werden. Daher muss für jedes Element im Standard Text, der ein Verweis ist, ein entsprechendes Element vorhanden sein, das die Typdefinition enthält. Um das verweisende Element und die Typdefinition zu korrelieren, verfügt die Typdefinition über ein id Attribut, das auf eine eindeutige Zeichenfolgen-ID festgelegt ist, und das verweisende Element verfügt über ein href Attribut, das auf dieselbe ID verweist.

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

Das UnreferencedObject Ereignis tritt auf, wenn im Dokument eine Typdefinition gefunden wurde, aber kein Parameter im Standard Text darauf verweist. Wenn das Ereignis auftritt, können Sie den XML-Typ des nicht referenzierten Objekts abrufen, indem Sie die UnreferencedObject -Eigenschaft der UnreferencedObjectEventArgs -Klasse untersuchen. Die XML-ID des Objekts wird von der UnreferencedId -Eigenschaft zurückgegeben.

Das UnreferencedObject Ereignis sollte nicht mit den UnknownElement Ereignissen und UnknownNode verwechselt werden, die auftreten, wenn kein Klassenmember vorhanden ist, der dem XML-Knoten oder Elementtyp entspricht.

Gilt für:

Produkt Versionen
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Weitere Informationen