Génération de messages SOAP à l'aide de la sérialisation XML
Comme un message SOAP est créé à l'aide de code XML, XmlSerializer peut être utilisé pour sérialiser des classes et générer des messages codés en SOAP. Le XML résultant est conforme à la section 5 du document du World Wide Web Consortium (www.w3.org) intitulé « Simple Object Access Protocol (SOAP) 1.1 ». Lorsque vous créez un service Web XML qui communique par l'intermédiaire de messages SOAP, vous pouvez personnaliser le flux XML en appliquant un ensemble d'attributs SOAP spéciaux aux classes et aux membres des classes. Pour obtenir une liste d'attributs, consultez Attributs qui contrôlent la sérialisation codée en SOAP.
Pour sérialiser un objet en tant que flux XML codé en SOAP
Créez la classe à l'aide de l'outil XML Schema Definition Tool (Xsd.exe).
Appliquez un ou plusieurs des attributs spéciaux qui se trouvent dans System.Xml.Serialization. Consultez la liste dans « Attributs qui contrôlent la sérialisation codée en SOAP ».
Créez XmlTypeMapping en créant un nouveau SoapReflectionImporter et en appelant la méthode ImportTypeMapping à l'aide du type de la classe sérialisée.
L'exemple suivant appelle la méthode ImportTypeMapping de la classe SoapReflectionImporter pour créer un XmlTypeMapping.
' Serializes a class named Group as a SOAP message. Dim myTypeMapping As XmlTypeMapping = (New SoapReflectionImporter(). _ ImportTypeMapping(GetType(Group)) [C#] // Serializes a class named Group as a SOAP message. XmlTypeMapping myTypeMapping = (new SoapReflectionImporter(). ImportTypeMapping(typeof(Group));
Créez une instance de la classe XmlSerializer en passant XmlTypeMapping au constructeur XmlSerializer.
Dim mySerializer As XmlSerializer = New XmlSerializer(myTypeMapping) [C#] XmlSerializer mySerializer = new XmlSerializer(myTypeMapping);
Appelez la méthode Serialize ou Deserialize.
Substitution de la sérialisation XML codée en SOAP
Le processus de substitution de la sérialisation XML d'objets comme messages SOAP est semblable au processus de substitution de la sérialisation XML standard. (Pour obtenir des informations sur la substitution de la sérialisation XML standard, consultez Substitution de la sérialisation XML.)
Pour substituer la sérialisation des objets comme messages SOAP
- Créez une instance de la classe SoapAttributeOverrides.
- Créez un SoapAttributes pour chaque membre de classe qui fait l'objet d'une sérialisation.
- Créez une instance d'un ou plusieurs attributs qui affectent la sérialisation XML (pour obtenir une liste, consultez « Attributs qui contrôlent la sérialisation codée en SOAP »), selon les cas, au membre qui fait l'objet d'une sérialisation.
- Attribuez l'attribut créé à l'étape 3 à la propriété appropriée de SoapAttributes.
- Ajoutez SoapAttributes à SoapAttributeOverrides.
- Créez XmlTypeMapping à l'aide de SoapAttributeOverrides. Utilisez la méthode SoapReflectionImporter.ImportTypeMapping.
- Créez XmlSerializer à l'aide de XmlTypeMapping.
- Sérialisez ou désérialisez l'objet.
L'exemple ci-dessous sérialise un fichier de deux manières : dans un premier temps, sans substituer le comportement de la classe XmlSerializer, dans un second temps, en substituant le comportement. L'exemple contient une classe nommée Group
avec plusieurs membres. Divers attributs, tels que SoapElementAttribute, ont été appliqués aux membres de la classe. Lorsque la classe est sérialisée à l'aide de la méthode SerializeOriginal
, les attributs contrôlent le contenu du message SOAP. Lorsque la méthode SerializeOverride
est appelée, le comportement de XmlSerializer est substitué en créant divers attributs et en attribuant les attributs aux propriétés de SoapAttributes (selon les cas).
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
public class Group
{
[SoapAttribute (Namespace = "http://www.cpandl.com")]
public string GroupName;
[SoapAttribute(DataType = "base64Binary")]
public Byte [] GroupNumber;
[SoapAttribute(DataType = "date", AttributeName = "CreationDate")]
public DateTime Today;
[SoapElement(DataType = "nonNegativeInteger", ElementName = "PosInt")]
public string PostitiveInt;
// This is ignored when serialized unless it is overridden.
[SoapIgnore]
public bool IgnoreThis;
public GroupType Grouptype;
[SoapInclude(typeof(Car))]
public Vehicle myCar(string licNumber)
{
Vehicle v;
if(licNumber == "")
{
v = new Car();
v.licenseNumber = "!!!!!!";
}
else
{
v = new Car();
v.licenseNumber = licNumber;
}
return v;
}
}
public abstract class Vehicle
{
public string licenseNumber;
public DateTime makeDate;
}
public class Car: Vehicle
{
}
public enum GroupType
{
// These enums can be overridden.
small,
large
}
public class Run
{
public static void Main()
{
Run test = new Run();
test.SerializeOriginal("SoapOriginal.xml");
test.SerializeOverride("SoapOverrides.xml");
test.DeserializeOriginal("SoapOriginal.xml");
test.DeserializeOverride("SoapOverrides.xml");
}
public void SerializeOriginal(string filename)
{
// Creates an instance of the XmlSerializer class.
XmlTypeMapping myMapping =
(new SoapReflectionImporter().ImportTypeMapping(
typeof(Group)));
XmlSerializer mySerializer =
new XmlSerializer(myMapping);
// Writing the file requires a TextWriter.
TextWriter writer = new StreamWriter(filename);
// Creates an instance of the class that will be serialized.
Group myGroup = new Group();
// Sets the object properties.
myGroup.GroupName = ".NET";
Byte [] hexByte = new Byte[2]{Convert.ToByte(100),
Convert.ToByte(50)};
myGroup.GroupNumber = hexByte;
DateTime myDate = new DateTime(2002,5,2);
myGroup.Today = myDate;
myGroup.PostitiveInt= "10000";
myGroup.IgnoreThis=true;
myGroup.Grouptype= GroupType.small;
Car thisCar =(Car) myGroup.myCar("1234566");
// Prints the license number just to prove the car was created.
Console.WriteLine("License#: " + thisCar.licenseNumber + "\n");
// Serializes the class, and closes the TextWriter.
mySerializer.Serialize(writer, myGroup);
writer.Close();
}
public void SerializeOverride(string filename)
{
// Creates an instance of the XmlSerializer class
// that overrides the serialization.
XmlSerializer overRideSerializer = CreateOverrideSerializer();
// Writing the file requires a TextWriter.
TextWriter writer = new StreamWriter(filename);
// Creates an instance of the class that will be serialized.
Group myGroup = new Group();
// Sets the object properties.
myGroup.GroupName = ".NET";
Byte [] hexByte = new Byte[2]{Convert.ToByte(100),
Convert.ToByte(50)};
myGroup.GroupNumber = hexByte;
DateTime myDate = new DateTime(2002,5,2);
myGroup.Today = myDate;
myGroup.PostitiveInt= "10000";
myGroup.IgnoreThis=true;
myGroup.Grouptype= GroupType.small;
Car thisCar =(Car) myGroup.myCar("1234566");
// Serializes the class, and closes the TextWriter.
overRideSerializer.Serialize(writer, myGroup);
writer.Close();
}
public void DeserializeOriginal(string filename)
{
// Creates an instance of the XmlSerializer class.
XmlTypeMapping myMapping =
(new SoapReflectionImporter().ImportTypeMapping(
typeof(Group)));
XmlSerializer mySerializer =
new XmlSerializer(myMapping);
TextReader reader = new StreamReader(filename);
// Deserializes and casts the object.
Group myGroup;
myGroup = (Group) mySerializer.Deserialize(reader);
Console.WriteLine(myGroup.GroupName);
Console.WriteLine(myGroup.GroupNumber[0]);
Console.WriteLine(myGroup.GroupNumber[1]);
Console.WriteLine(myGroup.Today);
Console.WriteLine(myGroup.PostitiveInt);
Console.WriteLine(myGroup.IgnoreThis);
Console.WriteLine();
}
public void DeserializeOverride(string filename)
{
// Creates an instance of the XmlSerializer class.
XmlSerializer overRideSerializer = CreateOverrideSerializer();
// Reading the file requires a TextReader.
TextReader reader = new StreamReader(filename);
// Deserializes and casts the object.
Group myGroup;
myGroup = (Group) overRideSerializer.Deserialize(reader);
Console.WriteLine(myGroup.GroupName);
Console.WriteLine(myGroup.GroupNumber[0]);
Console.WriteLine(myGroup.GroupNumber[1]);
Console.WriteLine(myGroup.Today);
Console.WriteLine(myGroup.PostitiveInt);
Console.WriteLine(myGroup.IgnoreThis);
}
private XmlSerializer CreateOverrideSerializer()
{
SoapAttributeOverrides mySoapAttributeOverrides =
new SoapAttributeOverrides();
SoapAttributes soapAtts = new SoapAttributes();
SoapElementAttribute mySoapElement = new SoapElementAttribute();
mySoapElement.ElementName = "xxxx";
soapAtts.SoapElement = mySoapElement;
mySoapAttributeOverrides.Add(typeof(Group), "PostitiveInt",
soapAtts);
// Overrides the IgnoreThis property.
SoapIgnoreAttribute myIgnore = new SoapIgnoreAttribute();
soapAtts = new SoapAttributes();
soapAtts.SoapIgnore = false;
mySoapAttributeOverrides.Add(typeof(Group), "IgnoreThis",
soapAtts);
// Overrides the GroupType enumeration.
soapAtts = new SoapAttributes();
SoapEnumAttribute xSoapEnum = new SoapEnumAttribute();
xSoapEnum.Name = "Over1000";
soapAtts.SoapEnum = xSoapEnum;
// Adds the SoapAttributes to the
// mySoapAttributeOverridesrides.
mySoapAttributeOverrides.Add(typeof(GroupType), "large",
soapAtts);
// Creates a second enumeration and adds it.
soapAtts = new SoapAttributes();
xSoapEnum = new SoapEnumAttribute();
xSoapEnum.Name = "ZeroTo1000";
soapAtts.SoapEnum = xSoapEnum;
mySoapAttributeOverrides.Add(typeof(GroupType), "small",
soapAtts);
// Overrides the Group type.
soapAtts = new SoapAttributes();
SoapTypeAttribute soapType = new SoapTypeAttribute();
soapType.TypeName = "Team";
soapAtts.SoapType = soapType;
mySoapAttributeOverrides.Add(typeof(Group),soapAtts);
// Creates an XmlTypeMapping that is used to create an instance
// of the XmlSerializer class. Then returns the XmlSerializer.
XmlTypeMapping myMapping = (new SoapReflectionImporter(
mySoapAttributeOverrides)).ImportTypeMapping(typeof(Group));
XmlSerializer ser = new XmlSerializer(myMapping);
return ser;
}
}
Voir aussi
Sérialisation XML | Attributs qui contrôlent la sérialisation codée en SOAP | Sérialisation XML à l'aide des services Web XML