Snippet

Binární serializace

Přidáno: 14.11.2008       Kategorie: Aplikace       Autor: Ondřej Linhart

Binární serializace je metodika, jakou se dá uložit a později obnovit libovolný serializovatelný typ. Za serializovatelný typ se považují základní datové typy a typy označené atributem <Serializable()>. Binární serializace narozdíl od XML serializace dokáže uložit a rekonstruovat kompletně celý typ včetně vnitřních (Private) proměnných.

Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Threading

Module Module1
  Sub Main()
    Dim person As New Person("Ondřej")
    'Vytvořit dočasný soubor
    Dim fileName = Path.GetTempFileName()
    'Vytvořit binární serializér
    Dim formatter As New BinaryFormatter()
    Using file As New FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read)
      'Serializovat objekt person
      formatter.Serialize(file, person)
      'Pozor, stream je nutné "přetočit" na začátek!
      file.Seek(0, SeekOrigin.Begin)
      'Deserializovat objekt ze souboru
      Dim deserializedPerson = DirectCast(formatter.Deserialize(file), Person)
      'Porovnat, zda-li se data deserializovaného objektu
      'shodují s původním serializovaným objektem.
      Debug.WriteLine(deserializedPerson.Equals(person))
    End Using
  End Sub
End Module

<Serializable()> Class Person
  Implements IDeserializationCallback
  'Tato vnitřní proměnná bude serializována.
  Private _id As Guid
  'Tato vnitřní proměnná nebude serializována.
  <NonSerialized()> Private _lock As ReaderWriterLock
  Private _name As String
  Public Sub New(ByVal name As String)
    _id = Guid.NewGuid()
    _lock = New ReaderWriterLock()
    _name = name
  End Sub
  Public ReadOnly Property Id() As Guid
    Get
      Return _id
    End Get
  End Property
  Public Property Name() As String
    Get
      Return _name
    End Get
    Set(ByVal value As String)
      'Zajišťuje přístup pouze jedním vláknem současně
      '(v tomto případě zbytečné, pouze pro účely ukázky).
      _lock.AcquireWriterLock(Timeout.Infinite)
      _name = value
      _lock.ReleaseWriterLock()
    End Set
  End Property
  ''' <summary>
  ''' Tato metoda bude automaticky zavolána při deserializaci.
  ''' </summary>
  Public Sub OnDeserialization(ByVal sender As Object) Implements System.Runtime.Serialization.IDeserializationCallback.OnDeserialization
    'Je nutné vytvořit novou instanci ReaderWriterLock, protože tento typ
    'není serializovatelný a tudíž nemůže být automaticky rekonstruován
    'při deserializaci.
    _lock = New ReaderWriterLock()
  End Sub
  Public Overrides Function Equals(ByVal obj As Object) As Boolean
    'Vrací True jestliže se data objektů shodují.
    'Pozor: Neporovnává zda-li se shodují instance (tj. zda-li
    'dvě referenční proměnné ukazují na stejný objekt).
    If TypeOf obj Is Person Then
      Dim otherPerson = DirectCast(obj, Person)
      If (Me._id = otherPerson._id) AndAlso (Me._name = otherPerson._name) Then
        Return True
      Else
        Return False
      End If
    Else
      Return False
    End If
  End Function
End Class 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.