VB.Net Tutorial/Socket Network/SOAP Serialization
Содержание
Class SOAP Deserialization
<source lang="vbnet">Imports System Imports System.IO Imports System.Runtime.Serialization Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters.Soap
Public Class Tester
Public Shared Sub Main Dim myClsSerializable As New ClsSerializable() SerializeSoap(myClsSerializable) Console.WriteLine(FileContent(False)) Dim myFileStream As FileStream myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) Dim myFormatter As New SoapFormatter() myClsSerializable = CType(myFormatter.Deserialize(myFileStream), ClsSerializable) Console.WriteLine(myClsSerializable.intNumber.ToString) Console.WriteLine(myClsSerializable.lngNumber.ToString) Console.WriteLine(myClsSerializable.strDemo) End Sub Private Shared Function FileContent(ByVal blnBinary As Boolean) As String Dim strContent As String Dim myStreamReader As StreamReader Dim myFileStream As FileStream Dim i As Integer Try myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) If blnBinary = True Then For i = 1 To myFileStream.Length strContent += myFileStream.ReadByte.ToString + " " Next Else myStreamReader = New StreamReader(myFileStream) strContent = myStreamReader.ReadToEnd End If myFileStream.Flush() myFileStream.Close() Return strContent Catch ex As IOException Console.WriteLine(ex.Message) End Try End Function Private Shared Sub SerializeSoap(ByVal myClsSerializable As ClsSerializable) Dim myFileStream As FileStream Dim myBFormatter As SoapFormatter = New SoapFormatter() Try myFileStream = New FileStream("test.dat", FileMode.Create, FileAccess.Write) myBFormatter.Serialize(myFileStream, myClsSerializable) myFileStream.Flush() myFileStream.Close() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
End Class
<Serializable()> Public Class ClsSerializable
Public intNumber As Integer = 254 Public strDemo As String = "This is a poublic test string" Private strpDemo As String = "This is a private test string" <NonSerialized()> Public lngNumber As Long = 123456
End Class</source>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.or g/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:// schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.ru/soap/encoding/clr/1.0" S OAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:ClsSerializable id="ref-1" xmlns:a1="http://schemas.microsoft.ru/clr/assem/main%2C%20Version%3D 0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <intNumber>254</intNumber> <strDemo id="ref-3">This is a poublic test string</strDemo> <strpDemo id="ref-4">This is a private test string</strpDemo> </a1:ClsSerializable> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 254 0 This is a poublic test string
Class SOAP Serialization
<source lang="vbnet">Imports System Imports System.IO Imports System.Runtime.Serialization Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters.Soap
Public Class Tester
Public Shared Sub Main Dim myClsSerializable As New ClsSerializable() SerializeSoap(myClsSerializable) Console.WriteLine(FileContent(False)) End Sub Private Shared Function FileContent(ByVal blnBinary As Boolean) As String Dim strContent As String Dim myStreamReader As StreamReader Dim myFileStream As FileStream Dim i As Integer Try myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) If blnBinary = True Then For i = 1 To myFileStream.Length strContent += myFileStream.ReadByte.ToString + " " Next Else myStreamReader = New StreamReader(myFileStream) strContent = myStreamReader.ReadToEnd End If myFileStream.Flush() myFileStream.Close() Return strContent Catch ex As IOException Console.WriteLine(ex.Message) End Try End Function Private Shared Sub SerializeSoap(ByVal myClsSerializable As ClsSerializable) Dim myFileStream As FileStream Dim myBFormatter As SoapFormatter = New SoapFormatter() Try myFileStream = New FileStream("test.dat", FileMode.Create, FileAccess.Write) myBFormatter.Serialize(myFileStream, myClsSerializable) myFileStream.Flush() myFileStream.Close() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
End Class
<Serializable()> Public Class ClsSerializable
Public intNumber As Integer = 254 Public strDemo As String = "This is a poublic test string" Private strpDemo As String = "This is a private test string" <NonSerialized()> Public lngNumber As Long = 123456
End Class</source>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.or g/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:// schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.ru/soap/encoding/clr/1.0" S OAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:ClsSerializable id="ref-1" xmlns:a1="http://schemas.microsoft.ru/clr/assem/main%2C%20Version%3D 0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <intNumber>254</intNumber> <strDemo id="ref-3">This is a poublic test string</strDemo> <strpDemo id="ref-4">This is a private test string</strpDemo> </a1:ClsSerializable> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
SOAP serialization and deserialization for a Class with ISerializable implementation
<source lang="vbnet">Imports System Imports System.IO Imports System.Runtime.Serialization Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters.Soap Public Class Tester
Public Shared Sub Main Dim myClsSerializable As New ClsSerializable() SerializeSoap(myClsSerializable) Console.WriteLine(FileContent(False)) Dim myFileStream As FileStream myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) Dim myFormatter As New SoapFormatter() myClsSerializable = CType(myFormatter.Deserialize(myFileStream), ClsSerializable) Console.WriteLine(myClsSerializable.strMessage) End Sub Private Shared Function FileContent(ByVal blnBinary As Boolean) As String Dim strContent As String Dim myStreamReader As StreamReader Dim myFileStream As FileStream Dim i As Integer Try myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) If blnBinary = True Then For i = 1 To myFileStream.Length strContent += myFileStream.ReadByte.ToString + " " Next Else myStreamReader = New StreamReader(myFileStream) strContent = myStreamReader.ReadToEnd End If myFileStream.Flush() myFileStream.Close() Return strContent Catch ex As IOException Console.WriteLine(ex.Message) End Try End Function Private Shared Sub SerializeSoap(ByVal myClsSerializable As ClsSerializable) Dim myFileStream As FileStream Dim myBFormatter As SoapFormatter = New SoapFormatter() Try myFileStream = New FileStream("test.dat", FileMode.Create, FileAccess.Write) myBFormatter.Serialize(myFileStream, myClsSerializable) myFileStream.Flush() myFileStream.Close() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
End Class <Serializable()> _
Public Class ClsSerializable Implements ISerializable Public intNumber As Integer = 1000 Public strMessage As String = "this is a string" Public lngTest As Long Public intArrayX(10) As Integer Public intArrayY(10) As Integer Public Sub New() ChangeMmberValue() End Sub Public Sub GetObjectData _ (ByVal info As SerializationInfo, ByVal context As StreamingContext) _ Implements ISerializable.GetObjectData info.AddValue("intNumber", intNumber) info.AddValue("message", strMessage) info.AddValue("intArrayX", intArrayX) End Sub Public Sub New _ (ByVal info As SerializationInfo, ByVal context As StreamingContext) intNumber = CInt(info.GetValue("intNumber", intNumber.GetType)) strMessage = CStr(info.GetValue("message", strMessage.GetType)) intArrayX = info.GetValue("intArrayX", intArrayX.GetType) End Sub Public Sub ChangeMmberValue() Dim i As Integer For i = 0 To 9 intArrayX(i) = i * 100 Next i intNumber = 2000 strMessage = "this is another string" End Sub
End Class</source>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.or g/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:// schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.ru/soap/encoding/clr/1.0" S OAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:ClsSerializable id="ref-1" xmlns:a1="http://schemas.microsoft.ru/clr/assem/main%2C%20Version%3D 0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <intNumber>2000</intNumber> <message id="ref-3">this is another string</message> <intArrayX href="#ref-4"/> </a1:ClsSerializable> <SOAP-ENC:Array id="ref-4" SOAP-ENC:arrayType="xsd:int[11]"> <item>0</item> <item>100</item> <item>200</item> <item>300</item> <item>400</item> <item>500</item> <item>600</item> <item>700</item> <item>800</item> <item>900</item> <item>0</item> </SOAP-ENC:Array> </SOAP-ENV:Body> </SOAP-ENV:Envelope> this is another string
SOAP serialization and deserialization for a derived Class
<source lang="vbnet">Imports System Imports System.IO Imports System.Runtime.Serialization Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters.Soap
Public Class Tester
Public Shared Sub Main Dim myClsSerializable As New ClsInherits() SerializeSoap(myClsSerializable) Console.WriteLine(FileContent(False)) Dim myFileStream As FileStream myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) Dim myFormatter As New SoapFormatter() myClsSerializable = CType(myFormatter.Deserialize(myFileStream), ClsSerializable) Console.WriteLine(myClsSerializable.strMessage) End Sub Private Shared Function FileContent(ByVal blnBinary As Boolean) As String Dim strContent As String Dim myStreamReader As StreamReader Dim myFileStream As FileStream Dim i As Integer Try myFileStream = New FileStream("test.dat", FileMode.Open, FileAccess.Read) If blnBinary = True Then For i = 1 To myFileStream.Length strContent += myFileStream.ReadByte.ToString + " " Next Else myStreamReader = New StreamReader(myFileStream) strContent = myStreamReader.ReadToEnd End If myFileStream.Flush() myFileStream.Close() Return strContent Catch ex As IOException Console.WriteLine(ex.Message) End Try End Function Private Shared Sub SerializeSoap(ByVal myClsSerializable As ClsSerializable) Dim myFileStream As FileStream Dim myBFormatter As SoapFormatter = New SoapFormatter() Try myFileStream = New FileStream("test.dat", FileMode.Create, FileAccess.Write) myBFormatter.Serialize(myFileStream, myClsSerializable) myFileStream.Flush() myFileStream.Close() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub
End Class <Serializable()> _ Public Class ClsInherits
Inherits ClsSerializable Public intInNumber As Integer Public strInMessage As String Public Sub New() intInNumber = 1024 End Sub Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext) MyBase.New(info, context) intInNumber = CInt(info.GetValue("n", intInNumber.GetType)) End Sub Public Overrides Sub GetObjectData _ (ByVal info As SerializationInfo, ByVal context As StreamingContext) MyBase.GetObjectData(info, context) info.AddValue("n", intInNumber) End Sub
End Class
<Serializable()> _
Public Class ClsSerializable Implements ISerializable Public intNumber As Integer = 1000 Public strMessage As String = "this is a string" Public lngTest As Long Public intArrayX(10) As Integer Public intArrayY(10) As Integer Public Sub New() ChangeMmberValue() End Sub Public Overridable Sub GetObjectData _ (ByVal info As SerializationInfo, ByVal context As StreamingContext) _ Implements ISerializable.GetObjectData info.AddValue("intNumber", intNumber) info.AddValue("message", strMessage) info.AddValue("intArrayX", intArrayX) End Sub Public Sub New _ (ByVal info As SerializationInfo, ByVal context As StreamingContext) intNumber = CInt(info.GetValue("intNumber", intNumber.GetType)) strMessage = CStr(info.GetValue("message", strMessage.GetType)) intArrayX = info.GetValue("intArrayX", intArrayX.GetType) End Sub Public Sub ChangeMmberValue() Dim i As Integer For i = 0 To 9 intArrayX(i) = i * 100 Next i intNumber = 2000 strMessage = "this is another string" End Sub
End Class</source>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.or g/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:// schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.ru/soap/encoding/clr/1.0" S OAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:ClsInherits id="ref-1" xmlns:a1="http://schemas.microsoft.ru/clr/assem/main%2C%20Version%3D0.0. 0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> <intNumber>2000</intNumber> <message id="ref-3">this is another string</message> <intArrayX href="#ref-4"/> <n>1024</n> </a1:ClsInherits> <SOAP-ENC:Array id="ref-4" SOAP-ENC:arrayType="xsd:int[11]"> <item>0</item> <item>100</item> <item>200</item> <item>300</item> <item>400</item> <item>500</item> <item>600</item> <item>700</item> <item>800</item> <item>900</item> <item>0</item> </SOAP-ENC:Array> </SOAP-ENV:Body> </SOAP-ENV:Envelope> this is another string