C# - SoapFormatter osztály használata

forráskód letöltése
A .NET Framework osztálykönyvtár System.Runtime.Serialization.Formatters.Soap névterében található SoapFormatter osztály használatát, metódusait mutatjuk be egy adatokat tartalmazó objektum szerializációja kapcsán. A művelet eredményeként generált XML állomány SOAP üzenet formátumú, így akár a hálózat objektumai között is mozgatható a SOAP csatornán.
A mellékelt alkalmazás referenciái közt meg kell adnunk a bevezetőben említett névteret tartalmazó assembly-t. A projekt gyorsmenüjében válasszuk az Add reference menüpontot, majd a .NET fül alatt keressük meg a System.Runtime.Serialization.Formatters.Soap.dll-t, és adjuk projektünkhöz.
Az alkalmazásban deklarálunk egy osztályt, mely két tagváltozóval rendelkezik. Ezeknek értéket adva fogjuk az objektumot szerializálni, majd visszaolvasni.
A szerializációt a SoapFormatter osztály Serialize metódusa végzi, melynek definíciója a következő:
Serialize
Osztály: SoapFormatter
public virtual void Serialize(
Stream serializationStream,
object graph
);
A kért objektumot képes szerializálni egy XML állományba.
Paraméterek
Stream serializationStream
Az állományhoz rendelt Stream objektum, melybe az adatokat beírjuk.
object graph
A mentendő objektum.
Az objektum adatainak visszafejtését a Deserialize metódus végzi, deklarációja a következő:
Deserialize
Osztály: SoapFormatter
public virtual object Deserialize(
Stream serializationStream
);
A megadott adatfolyamból visszafejti az objektum adatait, és visszaadja az objektum-példányt.
Paraméterek
Stream serializationStream
Az állományhoz rendelt adatfolyam.
A példánkban a következő osztályt hoztuk létre a szövegmezőben megadott adatok tárolására:
[Serializable]
public class NameObject 
{
  public string name = "";
  public string email = "";
}
Az osztályt, a mentés eredményes elvégzése érdekében, el kell látni a Serializable attribútummal. A MENTÉS gombra kattintva példányosítjuk az osztályt, majd értéket adunk változóinak.
NameObject no = new NameObject();
no.name = textBox1.Text;
no.email = textBox2.Text;
Létrehozunk egy példányt a SoapFormatter osztályból.
IFormatter formatter = new SoapFormatter();
Létrehozunk egy Stream objektumot az állományhoz, majd meghívjuk a Serialize metódust.
Stream stream = new FileStream("NameObject.xml", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, no);
stream.Close();
A NameObject.xml állomány az alkalmazás mappájába kerül.
A visszaolvasáshoz csak meghívjuk a metódust a Stream objektummal, majd a kapott objektumot explicit módon a kívánt típusra alakítjuk.
IFormatter formatter = new SoapFormatter();
Stream stream = new FileStream("NameObject.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
NameObject no = (NameObject) formatter.Deserialize(stream);
A kapott objektum már tartalmazza a kiolvasott értékeket.
Az állomány formátuma a SOAP boríték formátumát követi. Néhány érv, amiért a bináris szerializációval szemben ezt preferáljuk:
  • Emberi szem számára olvasható
  • Nincs rugalmatlan bináris konverzióra szükség
Az eredményül kapott állomány a következőképpen fest, a SOAP boríték magjában látható a tárolt információ:
<SOAP-ENV:Body>
  <a1:NameObject id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SOAPFormatterTest/SOAPFormatterTest%2C%20Version%3D1.0.1234.25541%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
    <name id="ref-3">Gipsz Jakab</name>
    <email id="ref-4">gipsz.jakab@mailer.com</email>
  </a1:NameObject>
</SOAP-ENV:Body>