XmlSerializer.UnreferencedObject Événement

Définition

Se produit lors de la désérialisation d'un flux XML encodé à l'aide de SOAP, lorsque XmlSerializer rencontre un type reconnu mais non utilisé ou non référencé.

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

Type d'événement

Exemples

L’exemple suivant ajoute un UnreferencedObjectEventHandler à un XmlSerializer. L’événement est géré par la Serializer``_``UnreferencedObject méthode . Pour exécuter l’exemple, coupez et collez le code XML suivant dans un fichier nommé « UnrefObj.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 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>

Remarques

L’événement UnreferencedObject se produit uniquement lorsque le XmlSerializer est utilisé pour désérialiser un document XML qui contient un message SOAP conforme à la section 5 du document du World Wide Web Consortium, SOAP (Simple Object Access Protocol) 1.1.

Les documents conformes à la section 5 sont dans un format spécial. À tout le moins, un tel document inclut le corps main du message SOAP. Toutefois, au lieu d’avoir tous les types définis en ligne dans le document, certaines définitions de type peuvent être encodées en tant que références à des éléments de niveau supérieur dans le document. Par conséquent, pour chaque élément trouvé dans le corps du main qui est une référence, il doit y avoir un élément correspondant qui contient la définition de type. Pour mettre en corrélation l’élément de référencement et la définition de type, la définition de type a un id attribut défini sur un ID de chaîne unique et l’élément de référencement a un href attribut qui fait référence au même 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" />
  </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>

L’événement UnreferencedObject se produit lorsqu’une définition de type est trouvée dans le document, mais qu’aucun paramètre dans le corps main ne le référence. Lorsque l’événement se produit, vous pouvez récupérer le type XML de l’objet non référencé en examinant la UnreferencedObject propriété de la UnreferencedObjectEventArgs classe . L’ID XML de l’objet est retourné par la UnreferencedId propriété .

L’événement UnreferencedObject ne doit pas être confondu avec les UnknownElement événements et UnknownNode , qui se produisent lorsqu’aucun membre de classe ne correspond au type d’élément ou de nœud XML.

S’applique à

Produit Versions
.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

Voir aussi