SOAP Serialization |
|
Object Serialization and De-Serialization |
Consider the following program: |
Imports System.IO Public Class Exercise Private Sub btnWrite_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnWrite.Click Dim Make As String = txtMake.Text Dim Model As String = txtModel.Text Dim Year As Integer = CInt(txtYear.Text) Dim CarColor As Integer = cbxColors.SelectedIndex Dim stmCar As FileStream = New FileStream("Car1.car", FileMode.Create) Dim bnwCar As BinaryWriter = New BinaryWriter(stmCar) Try bnwCar.Write(Make) bnwCar.Write(Model) bnwCar.Write(Year) bnwCar.Write(CarColor) Finally bnwCar.Close() stmCar.Close() End Try End Sub End Class Here is an example of running the program: This is an example of the techniques used in file processing to save individual data of primitive types: The values can be retrieved with the following code: Imports System.IO Public Class Exercise Private Sub btnWrite_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnWrite.Click Dim Make As String = txtMake.Text Dim Model As String = txtModel.Text Dim Year As Integer = CInt(txtYear.Text) Dim CarColor As Integer = cbxColors.SelectedIndex Dim stmCar As FileStream = New FileStream("Car1.car", FileMode.Create) Dim bnwCar As BinaryWriter = New BinaryWriter(stmCar) Try bnwCar.Write(Make) bnwCar.Write(Model) bnwCar.Write(Year) bnwCar.Write(CarColor) Finally bnwCar.Close() stmCar.Close() End Try End Sub Private Sub btnRead_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnRead.Click Dim stmCar As FileStream = New FileStream("Car1.car", FileMode.Open) Dim bnrCar As BinaryReader = New BinaryReader(stmCar) Try txtMake.Text = bnrCar.ReadString() txtModel.Text = bnrCar.ReadString() txtYear.Text = bnrCar.ReadUInt32().ToString() cbxColors.SelectedIndex = bnrCar.ReadInt32() Finally bnrCar.Close() stmCar.Close() End Try End Sub End Class In the same way, you can save the individual fields of a class or you can retrieve the individual fields of a car: Here is an example:
Imports System.IO Public Class Exercise Private Sub btnWrite_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnWrite.Click Dim Vehicle As Car = New Car() Vehicle.Make = txtMake.Text Vehicle.Model = txtModel.Text Vehicle.Year = CInt(txtYear.Text) Vehicle.Color = cbxColors.SelectedIndex Dim stmCar As FileStream = New FileStream("Car2.car", FileMode.Create) Dim bnwCar As BinaryWriter = New BinaryWriter(stmCar) Try bnwCar.Write(Vehicle.Make) bnwCar.Write(Vehicle.Model) bnwCar.Write(Vehicle.Year) bnwCar.Write(Vehicle.Color) Finally bnwCar.Close() stmCar.Close() End Try End Sub Private Sub btnRead_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnRead.Click Dim stmCar As FileStream = New FileStream("Car2.car", FileMode.Open) Dim bnrCar As BinaryReader = New BinaryReader(stmCar) Try Dim Vehicle As Car = New Car() Vehicle.Make = bnrCar.ReadString() Vehicle.Model = bnrCar.ReadString() Vehicle.Year = bnrCar.ReadUInt32() Vehicle.Color = bnrCar.ReadInt32() txtMake.Text = Vehicle.Make txtModel.Text = Vehicle.Model txtYear.Text = Vehicle.Year cbxColors.SelectedIndex = Vehicle.Color Finally bnrCar.Close() stmCar.Close() End Try End Sub End Class When it comes to a class, the problem with saving individual fields is that you could forget to save one of the fields. For example, considering a Car class, if you don't save the Make information of a Car object and retrieve or open the saved object on another computer, the receiving user would miss some information and the car cannot be completely identifiable. An alternative is to save the whole Car object. Object serialization consists of saving a whole object as one instead of its individual fields: In other words, a variable declared from a class can be saved to a stream and then the saved object can be retrieved later or on another computer. The .NET Framework supports two types of object serialization: binary and SOAP.
The .NET Framework supports a technique of serialization referred to as SOAP (which stands for Simple Object Access Protocol). This technique is a related to XML but, although we haven't studied XML, you don't need to know anything about it to use SOAP serialization.
To serialize an object using SOAP, you follow the same steps we reviewed for the binary serialization with one addition: you must add a certain reference. When creating the class whose objects would be serialized, mark it with the <Serializable> attribute. Here is an example: <Serializable()> Public Class Car Public Make As String Public Model As String Public Year As Integer Public Color As Integer End Class To support SOAP serialization, the .NET Framework provides the SoapFormatter class. This class is defined in the System.Runtime.Serialization.Formatters.Soap namespace that is part of the System.Runtime.Serialization.Formatters.Soap.dll assembly. In order to use The SoapFormatter class, you must reference this assembly. Then, you can create an object and initialize it as you see fit. Before saving it, as always, create a Stream-based object that would indicate the name (and location) of the file and the type of action to perform. Then, declare a SoapFormatter dim as iable using its default constructor. To actually save the object, call the Serialize() method of this class. This method uses the same syntax as that of the BinaryFormatter class: it takes two arguments. The first is a Stream-based object. The second is the object that needs to be serialized.
De-serialization in soap is performed exactly as done for the binary de-serialization. To support it, the SoapFormatter class is equipped with the Deserialize() method. This method uses the same syntax as its equivalent of the BinaryFormatter class. The approach to use it is also the same.
In the examples we have used so far, we were saving the whole object. You can make it possible to save only some parts of the class. When creating a class, you can specify what fields would be serialized and which ones would not be. To specify that a member cannot be saved, you can mark it with the <NonSerialized()> attribute. Here is an example: <Serializable()> Public Class Car1 Public Make As String Public Model As String ' Because the value of a car can change, ' there is no reason to save it <NonSerialized()> _ Public Value As Double Public Year As Integer Public Color As Integer End Class After creating the class, you can declare a variable of it and serialize it, using either the binary or the SOAP approach. You can then retrieve the object and its values, using any of the techniques we learned earlier.
To support serialization, the .NET Framework provides the ISerializable interface. You can create a class that implements this interface to customize the serialization process. Even if you plan to use this interface, the class you create must be marked with the <Serializable> attribute.
The .NET Framework is filled with many classes ready for serialization. To know that a class is ready for serialization, when viewing its documentation either in the MSDN web site or in the help documentation, check that it is marked with the [SerializableAttribute]. Here is an example of such as class:
|
Some of these classes provide the properties and methods to create an object and directly save it. For some other classes, you must first create a class, mark it with the <SerializableAttribute> attribute, build an object of it, and then pass it to the .NET class. |
|
||
Home | Copyright © 2008-2016, FunctionX, Inc. | |
|