Page d'Accueil

Sérialisation en SOAP

 

Introduction

.NET Framework soutient une technique de sérialisation désignée sous le nom de SOAP (Simple Object Access Protocol) (qui représente le protocole simple d'Accès à d'objet). Cette technique est un peu plus reliée à XML mais, bien que nous n'ayons pas étudié XML, vous n'avez pas besoin de savoir quoi que se soit à son sujet pour utiliser la sérialisation SOAP.

Practical Learning: Introducing SOAP Serialization

  1. Commencez une nouvelle Application de Console appelée PropertyRental1
  2. Pour créer une nouvelle classe, sur le menu principal, cliquez Project -> Ajouter Classe
  3. donnez le nom Property et appuyez Enter
  4. Changez le fichier comme suit:
     
    using System;
    
    namespace PropertyRental1
    {
        public enum TypeOfProperty
        {
            Appartment,
            SingleFamily,
            Townhouse,
            Unknown
        }
    
        public enum Condition
        {
            Excellent,
            Good,
            NeedsRepair,
            Unknown
        }
    
        [Serializable]
        public class Property
        {
            private long propCode;
            private TypeOfProperty tp;
            private Condition cond;
            private short beds;
            private float baths;
            private int levels;
            private decimal val;
    
            public long PropertyCode
            {
                get { return propCode; }
                set { propCode = value; }
            }
    
            public TypeOfProperty PropertyType
            {
                get { return tp; }
                set { tp = value; }
            }
    
            public Condition PropertyCondition
            {
                get { return cond; }
                set { cond = value; }
            }
    
            public short Bedrooms
            {
                get { return beds; }
                set { beds = value; }
            }
    
            public float Bathrooms
            {
                get { return (baths <= 0) ? 0.00f : baths; }
                set { baths = value; }
            }
    
            public int Stories
            {
                get { return levels; }
                set { levels = value; }
            }
    
            public decimal MonthlyRent
            {
                get { return (val <= 0) ? 0.00M : val; }
                set { val = value; }
            }
    
            public Property()
            {
                Random rnd = new Random();
                propCode = rnd.Next(100000, 999999);
                tp = TypeOfProperty.Unknown;
                cond = Condition.Unknown;
                beds = 0;
                baths = 0.0f;
                levels = 0;
                val = 0.00M;
            }
        }
    }
  5. Pour créer une nouvelle classe, sur le menu principal, cliquez Project -> Ajouter Classe
  6. donnez le nom PropertyListing et appuyez Enter
  7. Changez le fichier comme suit:
     
    using System;
    
    namespace PropertyRental1
    {
        [Serializable]
        public class PropertyListing
        {
            private Property[] prop = new Property[100];
    
            public Property this[int i]
            {
                get { return prop[i]; }
                set { prop[i] = value; }
            }
        }
    }
  8. Sauvegardez tout

     Sérialiser avec  SOAP

Pour Sérialiser un objet à l'aide du SOAP, vous suivez les mêmes étapes que nous avons passées en revue pour la Sérialisation binaire avec une addition que vous devez ajouter à une certaine référence.

En créant la classe dont les objets seraient Sérialisés, la marquer avec l'attribut [Serializable]. Voici un exemple :

[Serializable]
public class Car
{
    public string Make;
    public string Model;
    public uint   Year;
    public byte Color;
}

Pour soutenir la Sérialisation SOAP, .NET Framework fournit la classe SoapFormatter. Cette classe est définie dans le namespace System.Runtime.Serialization.Formatters.Soap qui fait partie de l'ensemble system.Runtime.Serialization.Formatters.Soap.dll. Afin d'utiliser la classe SoapFormatter, vous devez référencer cette ensemble. Vous pouvez faire ceci en l'ajoutant à votre liste de références. Après ces deux étapes, vous pouvez créer un objet et l'initialiser. Avant de le sauvegarder comme toujours, créez un objet basé sur le Stream qui indiquerait le nom (et l'endroit) du fichier et le type d'action à exécuter. Puis, déclarez une variable  SoapFormatter en utilisant son constructeur par défaut. Pour sauvegarder réellement l'objet, appelez la méthode serialize () de cette classe. Cette méthode utilise la même syntaxe que celle de la classe BinaryFormatter : elle prend deux arguments. Le premier est un objet basé sur Stream. La seconde est l'objet qui doit être Sérialisé.

Voici un exemple :

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

[Serializable]
public class Car
{
    public string  Make;
    public string  Model;
    public uint    Year;
    public byte    Color;
}

public static class Program
{
    public static int Main(string[] args)
    {
        Car vehicle = new Car();

        vehicle.Make  = "Volvo";
        vehicle.Model = "S40";
        vehicle.Year  = 2006;
        vehicle.Color = 3;

        FileStream stmCar =
            new FileStream("Car4.car",
                           FileMode.Create);
        SoapFormatter sopCar = new SoapFormatter();

        sopCar.Serialize(stmCar, vehicle);
        return 0;
    }
}
   

 

Etude pratique: Sérialiser avec SOAP

  1. Pour ajouter le support SOAP votre project, sur le menu principal, cliquez Project -> Ajouter Reference...
  2. Dans la boîte de dialogue Ajouter Reference et dans l'étiquette .NET, tirez le curseur vers le bas et sélectionnez System.Runtime.Serialization.Formatters.Soap:

    Adding a reference to the System.Runtime.Serialization.Formatters.Soap.dll assembly

  3. Cliquez OK
  4. Accédez au fichier Program.cs et changez le comme suit:
     
    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Soap;
    
    namespace PropertyRental1
    {
        class Program
        {
            static PropertyListing CreateListing()
            {
                Random rnd = new Random();
                Property prop = new Property();
                PropertyListing listing = new PropertyListing();
    
                prop = new Property();
    
    	    // Create a few properties ready to be rented
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.SingleFamily;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 5;
                prop.Bathrooms = 3.5f;
                prop.Stories = 3;
                prop.MonthlyRent = 2650;
                listing[0] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.Townhouse;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 3;
                prop.Bathrooms = 2.5f;
                prop.Stories = 3;
                prop.MonthlyRent = 1750;
                listing[1] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.SingleFamily;
                prop.PropertyCondition = Condition.Good;
                prop.Bedrooms = 4;
                prop.Bathrooms = 2.5f;
                prop.Stories = 2;
                prop.MonthlyRent = 2450;
                listing[2] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.Appartment;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 1;
                prop.Bathrooms = 1.0f;
                prop.Stories = 1;
                prop.MonthlyRent = 880;
                listing[3] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.Townhouse;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 3;
                prop.Bathrooms = 2.5f;
                prop.Stories = 2;
                prop.MonthlyRent = 1880;
                listing[4] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.Appartment;
                prop.PropertyCondition = Condition.Good;
                prop.Bedrooms = 2;
                prop.Bathrooms = 1.0f;
                prop.Stories = 1;
                prop.MonthlyRent = 1050;
                listing[5] = prop;
                
    	    // Since we don't yet have a complete list of properties
    	    // Create some empty ones
                for (int i = 5; i < 100; i++)
                {
                    prop = new Property();
                   
                    listing[i] = prop;
                }
                return listing;
            }
    
            static int Main()
            {
                PropertyListing props = CreateListing();
                Property prop = new Property();
    
                FileStream prpStream =
                    new FileStream("properties.rnt",
                                   FileMode.Create);
                SoapFormatter prpSoap = new SoapFormatter();
    
                prpSoap.Serialize(prpStream, props);
    
                for (int i = 0; i < 16; i++)
                {
                    prop = props[i];
                    Console.WriteLine("{0}.----------------------------------", i + 1);
                    Console.WriteLine("Property #:   {0}", prop.PropertyCode);
                    Console.WriteLine("Type:         {0}", prop.PropertyType);
                    Console.WriteLine("Condition:    {0}", prop.PropertyCondition);
                    Console.WriteLine("Bedrooms:     {0}", prop.Bedrooms);
                    Console.WriteLine("Bathrooms:    {0}", prop.Bathrooms);
                    Console.WriteLine("Stories:      {0}", prop.Stories);
                    Console.WriteLine("Market Value: {0}\n", prop.MonthlyRent);
                }
                Console.WriteLine("======================================");
                
                return 0;
            }
        }
    }
  5. Appuyez Ctrl + F5 pour executer l'application

Désérialisation  en série

la Désérialisation en série dans SOAP est effectuée exactement comme fait pour la Désérialisation en série binaire. Pour la soutenir, la classe SoapFormatter est équipée de la méthode Deserialize (). Cette méthode utilise la même syntaxe que son équivalent de la classe BinaryFormatter. L'approche pour l'utiliser est également identique.

Voici un exemple :

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

[Serializable]
public class Car
{
    public string  Make;
    public string  Model;
    public uint    Year;
    public byte    Color;
}

public static class Program
{
    public static int Main(string[] args)
    {
        FileStream stmCar =
            new FileStream("Car4.car",
                           FileMode.Open);
        SoapFormatter sopCar = new SoapFormatter();
        Car vehicle = (Car)sopCar.Deserialize(stmCar);
        
        Console.WriteLine("Car Information");
        Console.WriteLine("Make: {0}",       vehicle.Make );
        Console.WriteLine("Model: {0}", vehicle.Model);
        Console.WriteLine("Year: {0}", vehicle.Year);
        Console.Write("Color: ");
        switch (vehicle.Color)
        {
            case 1:
                Console.WriteLine("Black");
                break;
            case 2:
                Console.WriteLine("Gray");
                break;
            case 3:
                Console.WriteLine("White");
                break;
            case 4:
                Console.WriteLine("Red");
                break;
            case 5:
                Console.WriteLine("Blue");
                break;
        }
        return 0;
    }
}

Practical Learning: Désérialisation  avec SOAP

  1. Pour désérialiser, changez le contenu du fichier Program.cs comme suit:
     
    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Soap;
    
    namespace PropertyRental1
    {
        class Program
        {
            static int Main()
            {
                Property prop = new Property();
    
                // Open the list/collection of properties
                FileStream prpStream =
                    new FileStream("properties.rnt",
                                   FileMode.Open);
                SoapFormatter prpSoap = new SoapFormatter();
                PropertyListing props = 
    		(PropertyListing)prpSoap.Deserialize(prpStream);
                prpStream.Close();
    
                for (int i = 0; i < 16; i++)
                {
                    prop = props[i];
                    Console.WriteLine("{0}.----------------------------------",
    			 i + 1);
                    Console.WriteLine("Property #:   {0}", prop.PropertyCode);
                    Console.WriteLine("Type:         {0}", prop.PropertyType);
                    Console.WriteLine("Condition:    {0}", 
    			prop.PropertyCondition);
                    Console.WriteLine("Bedrooms:     {0}", prop.Bedrooms);
                    Console.WriteLine("Bathrooms:    {0}", prop.Bathrooms);
                    Console.WriteLine("Stories:      {0}", prop.Stories);
                    Console.WriteLine("Market Value: {0}\n", prop.MonthlyRent);
                }
                Console.WriteLine("======================================");
                
                return 0;
            }
        }
    }
  2. Appuyez Ctrl + F5 pour executer l'application
  3. Après observation du resultat, Fermez la fenêtre DOS
  4. Pour appliquer un exemple de mise à jour du fichier, changez le contrnu du fichier Program.cs comme suit:
     
    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Soap;
    
    namespace PropertyRental1
    {
        class Program
        {
            static int Main()
            {
                Property prop = new Property();
    
                // Open the list/collection of properties
                FileStream prpStream =
                    new FileStream("properties.rnt",
                                   FileMode.Open);
                SoapFormatter prpSoap = new SoapFormatter();
                // Get the list of properties and store it in an array
                PropertyListing props = 
    		(PropertyListing)prpSoap.Deserialize(prpStream);
                // Close the stream while we are working on something else
                prpStream.Close();
    
                // To add a few properties, we will actually replace
                // some "empty" properties whose placeholders we defined earlier
                Random rnd = new Random();
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.Appartment;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 2;
                prop.Bathrooms = 2.0f;
                prop.Stories = 1;
                prop.MonthlyRent = 1240;
                props[7] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.SingleFamily;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 3;
                prop.Bathrooms = 2.5f;
                prop.Stories = 3;
                prop.MonthlyRent = 1750;
                props[8] = prop;
    
                prop = new Property();
                prop.PropertyCode = rnd.Next(100000, 999999);
                prop.PropertyType = TypeOfProperty.SingleFamily;
                prop.PropertyCondition = Condition.Good;
                prop.Bedrooms = 5;
                prop.Bathrooms = 3.5f;
                prop.Stories = 3;
                prop.MonthlyRent = 3475;
                props[14] = prop;
    
                prop = new Property();
                prop.PropertyType = TypeOfProperty.Appartment;
                prop.PropertyCondition = Condition.Excellent;
                prop.Bedrooms = 2;
                prop.Bathrooms = 1.0f;
                prop.Stories = 1;
                prop.MonthlyRent = 1275;
                props[28] = prop;
    
                // Reopen the stream
                prpStream = new FileStream("properties.rnt",
                                           FileMode.Create);
                prpSoap = new SoapFormatter();
    
                // Open the file and save it
                prpSoap.Serialize(prpStream, props);
                prpStream.Close();
    
                // That's it
    
                for (int i = 0; i < 16; i++)
                {
                    prop = props[i];
                    Console.WriteLine("{0}.----------------------------------",
    			 i + 1);
                    Console.WriteLine("Property #:   {0}", prop.PropertyCode);
                    Console.WriteLine("Type:         {0}", prop.PropertyType);
                    Console.WriteLine("Condition:    {0}",
    			 prop.PropertyCondition);
                    Console.WriteLine("Bedrooms:     {0}", prop.Bedrooms);
                    Console.WriteLine("Bathrooms:    {0}", prop.Bathrooms);
                    Console.WriteLine("Stories:      {0}", prop.Stories);
                    Console.WriteLine("Market Value: {0}\n", prop.MonthlyRent);
                }
                Console.WriteLine("======================================");
    
                return 0;
            }
        }
    }
  5. Appuyez Ctrl + F5 pour executer l'application
 

Page d'Accueil Copyright © 2007, Yevol