Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Проблемы с "простой" десериализацией Добавлено: 09.12.13 05:45  

Автор вопроса:  ---Fix--- | ICQ: 348680795 
Первый раз запускаю, сохраняется и все поля с правильными значениями, второй раз запускаю - при десериализации поля нулевые, но никаких ошибок или исключений при этом не выдается.
Форма

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        MessageBox.Show(Settings.General.RunTime.ToString)
    End Sub
End Class


Глобальный модуль

Module Main
    Public Settings As New clsSettings

    Public Class Securiry

        Public Shared Function AES_StringEncrypt(ByVal input As String, ByVal pass As String) As String
    '...
        End Function

        Public Shared Function AES_StringDecrypt(ByVal input As String, ByVal pass As String) As String
    '...
        End Function

    End Class

    Public Class HideMembers
        Public Shared Sub LoadSettings(ByVal pFile As String)
            Dim FilePath As String = pFile
            Using FS As New IO.FileStream(FilePath, IO.FileMode.Open, IO.FileAccess.Read)
                Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
                Settings = DirectCast(BF.Deserialize(FS), clsSettings)
                'FS.Close()
            End Using
        End Sub
    End Class
End Module


Класс, который сериализую и обратно

<Serializable> _
Public Class clsSettings
    <NonSerialized> Private GeneralFileName As String = "Data.bin"
    <NonSerialized> Private Dir As String = My.Application.Info.DirectoryPath & "\"
    <NonSerialized> Private FilePath As String = Dir & GeneralFileName

    Public Sub New()
        'Грузим настройки
        If IO.File.Exists(FilePath) Then
            Load()
        Else
            General.RunTime = New Date(2013I, 12I, 1I, 7I, 0I, 0I)
            Dim Dir As String = My.Computer.FileSystem.CurrentDirectory
            General.PlatformFolder = New IO.FileInfo(Dir)
            BaseParameters.BaseLocation = New IO.FileInfo(Dir)
            BaseParameters.User = ""
            BaseParameters.Password = ""
            Save()
        End If
    End Sub

    Friend General As New clsGeneral()
    <Serializable, System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
    Friend Class clsGeneral
        Public RunTime As Date
        Public PlatformFolder As IO.FileInfo

        Public Sub New()

        End Sub
    End Class

    Friend BaseParameters As New clsBaseParameters()
    <Serializable, System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
    Friend Class clsBaseParameters
        Public BaseLocation As IO.FileInfo
        Public User As String
        Private fPassword As String

        Public Sub New()

        End Sub

        Public Property Password As String
            Get
                If fPassword = "" Then
                    Return ""
                Else
                    Return Main.Securiry.AES_StringDecrypt(fPassword, User)
                End If
            End Get
            Set(value As String)
                If value = "" Then
                    fPassword = ""
                Else
                    fPassword = Main.Securiry.AES_StringEncrypt(fPassword, User)
                End If
            End Set
        End Property
    End Class

    Public Sub Save()
        Try
            Using FS As New IO.FileStream(FilePath, IO.FileMode.Create, IO.FileAccess.Write)
                Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
                BF.Serialize(FS, Me)
                'FS.Close()
            End Using
        Catch ex As Exception
            MessageBox.Show("Возникла ошибка при сохранении!")
        End Try
    End Sub


    Public Sub Load()
        Main.HideMembers.LoadSettings(FilePath)
    End Sub
End Class

Вобщем попытался сделать как из примера с MSDN "Basic serialization" но где именно ошибка не могу отследить. Кто сталкивался, где ошибка? Может не нужно так усложнять класс?
P.S. Приму любую критику с пояснением.

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 ---Fix---



ICQ: 348680795 

Вопросов: 12
Ответов: 33
 Профиль | | #1 Добавлено: 11.12.13 08:56
В общем так и не получилось у меня найти причину, хотя она, вероятно, самая простая тут. Как бы дико это не звучало, но я написал некое подобие собственного сериализатора, в нем нет контроля версий, но зато он отлично справляется со вложенными собственными типами и стандартными переменными. Плюсы - 1) хоть какой-то результат. Не надо описывать каждое поле при сохранении, загрузке 2) меньше места на диске по сравнению с обычной бинарной. Минусы - 1)нет контроля версий (это мне и не нужно) 2) если в сериализуемый класс добавляется не поддерживаемый классом тип из библиотеки Net.Framework то его придется описать в сериализаторе. 3) Пока работает но еще неизвестно, что будет дальше.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам