تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مثال على Custom Serialization من خلال فئة اسم مستخدم وكلمة مرور
#1
كاتب الموضوع : samerselo

لنفرض أنه لدينا فئة تحتفظ بمعلومات اسم مستخدم وكلمة مرور ما ونريد أن نقوم بتخزين هذه الفئة على القرص وسنفترض مبدئيا أن فئتنا على الشكل

كود :
Public Class ProgramPass
' UserName & Password Fields
Private _UserName As String
Private _Password As String

' Encription/Decryption Function
' Simple XOR based Encryption
Private Function EncrDecr(ByVal Pass As String, _
Optional ByVal Cyp As Char = "Í") As String

Dim Temp(Pass.Length - 1) As Char
For i As Integer = 0 To Pass.Length - 1
Temp(i) = Chr(Asc(Pass(i)) Xor Asc(Cyp))
Next
Return Temp
End Function


' Return True if the UserName & Passward passed
' Matching ones that stored in the class
Public Function IsCredentialOK(ByVal User As String, _
ByVal pass As String) As Boolean

If EncrDecr(_UserName) = User AndAlso EncrDecr(_Password) = pass Then
Return True
Else
Return False
End If
End Function

' UserName Property
Public Property UserName() As String
Get
' Decrypt before Return
Return EncrDecr(_UserName)
End Get
Set(ByVal value As String)
' Encrypt Before Save
_UserName = EncrDecr(value)
End Set
End Property

' Password WriteOnly Property
Public WriteOnly Property Password() As String
Set(ByVal value As String)
' Encrypt Before Save
_Password = EncrDecr(value)
End Set
End Property

' Empty Constructor
Public Sub New()

End Sub

End Class

كما نرى الفئة بسيطة عبارة عن حقلين خاصين لاسم المستخدم وكلمة المرور يتم التحكم بهما عن طريق خاصيتين UserName و Password وتخزين القيم في هذه المتغيرات يكون عبر إجرائية تشفير بسيطة تقوم بتشفير البيانات الممرة لها ثم تخزنها في الحقول المرتبطة بهذه الخصائص. ولحفظ معلومات الفئة على القرص كي نستطيع استعادها عند الحاجة سنتخدم ما يسمسى بـ Custom Serialization وسنحتاج للاستيرادات التالية في مثالنا هذا

كود :
Imports System.Runtime.Serialization
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Soap
أولا نقوم بتزيين تعريف الفئة بالواصفة Serializable نضيف تعريف للفئة بأنها تقدم الواجهة ISerializable فيصبح تعريف الفئة على الشكل

كود :
<Serializable()> _
Public Class ProgramPass
' The Class Must Implements ISerializable Interface
Implements ISerializable
ولتحقيق الواجهة Iserializable يجب علينا تقديم الوظيفة GetObjectData التي سيستخدمها الـ SoapFormatter لاحقا للقيام بعملية Serialization للفئة وتخزينها على القرص حيث نستخدم الطريقة info.AddValue لإضافة القيم التي نحتاج لتخزينها ويكون كود هذه الوظيفة كما يلي

كود :
' ISerializable Interface Procedure for Identifying Data
' to be serialized
Public Sub GetObjectData(ByVal info As

System.Runtime.Serialization.SerializationInfo, _
ByVal context As System.Runtime.Serialization.StreamingContext)

_
Implements

System.Runtime.Serialization.ISerializable.GetObjectData

' Adding Data that Will be Saved
info.AddValue("UserName", _UserName)
info.AddValue("Password", _Password)

End Sub
بقي علينا إنشاء باني خاص للفئة كي يستخدمه الـ SoapFormatter لإعادة تشكيل الفئة عندما نريد استعادتها من الملف المخزن على القرص مستخدمين الطريقة si.GetString للحصول على البيانات ويكون كود الباني كما يلي

كود :
' Special Constructor for serialization
' Called by formatter when object graph is being deseralized.
Private Sub New(ByVal si As SerializationInfo, ByVal ctx As

StreamingContext)
_UserName = si.GetString("UserName")
_Password = si.GetString("Password")
End Sub
وبالتالي يكون الكود الكامل للفئة كما يلي

كود :
<Serializable()> _
Public Class ProgramPass
' The Class Must Implements ISerializable Interface
Implements ISerializable

' UserName & Password Fields
Private _UserName As String
Private _Password As String

' Encription/Decryption Function
' Simple XOR based Encryption
Private Function EncrDecr(ByVal Pass As String, _
Optional ByVal Cyp As Char = "&Iacute;") As String

Dim Temp(Pass.Length - 1) As Char
For i As Integer = 0 To Pass.Length - 1
Temp(i) = Chr(Asc(Pass(i)) Xor Asc(Cyp))
Next
Return Temp
End Function


' Return True if the UserName & Passward passed
' Matching ones that stored in the class
Public Function IsCredentialOK(ByVal User As String, _
ByVal pass As String) As Boolean

If EncrDecr(_UserName) = User AndAlso EncrDecr(_Password) = pass Then
Return True
Else
Return False
End If
End Function

' UserName Property
Public Property UserName() As String
Get
' Decrypt before Return
Return EncrDecr(_UserName)
End Get
Set(ByVal value As String)
' Encrypt Before Save
_UserName = EncrDecr(value)
End Set
End Property

' Password WriteOnly Property
Public WriteOnly Property Password() As String
Set(ByVal value As String)
' Encrypt Before Save
_Password = EncrDecr(value)
End Set
End Property

' ISerializable Interface Procedure for Identifying Data
' to be serialized
Public Sub GetObjectData(ByVal info As

System.Runtime.Serialization.SerializationInfo, _
ByVal context As System.Runtime.Serialization.StreamingContext)

_
Implements

System.Runtime.Serialization.ISerializable.GetObjectData

' Adding Data that Will be Saved
info.AddValue("UserName", _UserName)
info.AddValue("Password", _Password)

End Sub

' Empty Constructor
Public Sub New()

End Sub

' Special Constructor for serialization
' Called by formatter when object graph is being deseralized.
Private Sub New(ByVal si As SerializationInfo, ByVal ctx As

StreamingContext)
_UserName = si.GetString("UserName")
_Password = si.GetString("Password")
End Sub

End Class
ويكون استخدام فئتنا - حفظ واستعادة - عمليا كما يلي
في البداية نقوم بتعريف متغير من نوع الفئة ProgramPass ونضبط قيم الخاصيتين UserName و Password ثم نقوم بعملية التخزين الفعلي لهذه الفئة على القرص حيث سنستخدم متغير من
النوع SoapFormatter الذي سيقوم بعملية التشكيل المناسب للفئة وتخزينها على القرص باستخدام الطريقة Serialize ممررين لها متغير من النوع FileStream ويكون البارمتر الثاني المتغير السابق الذي عرفناه الفئة ProgramPass الذي خزنا فيه اسم المستخدم وكلمة المرور كما في الكود

كود :
Private Sf As New SoapFormatter
Private PassFileName As String = "d:\Security.xml"

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click
Dim p As New ProgramPass()
p.UserName = Me.TextBox1.Text
p.Password = Me.TextBox2.Text
Using St As New FileStream(PassFileName, FileMode.Create, FileAccess.Write)
Sf.Serialize(St, p)
End Using
End Sub
بعد قيامنا بتخزين فئتنا ProgramPass على القرص وعندما نحتاج لإعادة تشكيل هذه الفئة اعتمادا على الملف الذي قمنا بتخزين فئتنا ضمنه سنستخدم متغير من النوع SoapFormatter الذي سيقوم بقراءة معلومات الفئة من الملف المخزن على القرص باستخدام الطريقة Desrialize التي سنمرر لها متغير من النوع FileStream يشير للملف الحاوي على البيانات ويكون البارامتر الثاني اسم فئتنا ProgramPassالتي نريد تشكيلها وفق المعلومات المخزنة في الملف معيدة قيمة تكون من نوع هذه الفئة ProgramPass حاوية على البيانات المقروءة وبعدها يمكننا اختبار صحة اسم المستخدم وكلمة المرور المدخلين من قبل المستخدم مع القيم المخزنة ضمن الفئة باستخدام الوظيفة IsCredentialOK الخاصة بفئتنا الأساسية ويكون الكود كما يلي

كود :
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click
' Deserialize.
Dim p As New ProgramPass
Using St As New FileStream(PassFileName, FileMode.Open,

FileAccess.Read)
p = CType(Sf.Deserialize(St), ProgramPass)
End Using

If p.IsCredentialOK(Me.TextBox3.Text, Me.TextBox4.Text) Then
MsgBox("Access Granted")
Else
MsgBox("Access Denied")
End If
End Sub
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  تنفيذ كود vb.net من خلال مربع نص @@أبورائد@@ 20 14,625 06-10-21, 05:05 PM
آخر رد: الماجيك مسعد
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,197 01-07-21, 11:42 AM
آخر رد: kebboud
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 25 15,206 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  مثال القراءة والكتابه على ملف تيكست Txt على الانترنت + مثال + شرح m.sami.ak 11 8,408 02-06-18, 09:46 PM
آخر رد: YousefOkasha
  التــعامل مع cmd من خلال الدوت نت مبتدئ في الاحتراف 3 3,783 02-06-18, 12:36 AM
آخر رد: YousefOkasha
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 11,545 28-04-18, 06:55 PM
آخر رد: moniam
  الطباعة على الوورد من خلال الفيجوال بطريقة مبسطة abdullah 10 15,592 01-04-18, 03:16 AM
آخر رد: سعود الشامان
  [مقال] التخاطب مع الاكسل من خلال مكاتب OpenXml و Closed Xml ابو ليلى 3 2,723 28-03-18, 08:30 AM
آخر رد: الوايلي
  حصرياً ( إطبع على الوورد من خلال برنامجك ) ( شرح بالصور ) m.sami.ak 21 12,542 23-02-18, 11:04 AM
آخر رد: احمد نعمة عبد السلام
  موضوع الاستاذ رامي مثال \ لطريقة تفعيل برنامجك عند العميل وتغيير كلمة مرور اRamilove سعود 8 7,701 06-10-17, 01:43 AM
آخر رد: حمادة دراز

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم