如何修复反序列化错误?

时间:2014-07-09 21:02:55

标签: vb.net

为什么,大家好!

我已经有这个项目,我已经工作了几个月。它的基本背景故事是,它应该能够在后台传输和安装Windows应用程序,就像iCloud为应用程序做的那样!

Anywho,我正在使用序列化/反序列化方法来保存属性(例如管理员用户名和密码,目录,端口等)。

我有一个名为' PropertyNest '的类,表示属性和内存分配的链接。我将其剪切为只有XMLSerializer查看并保存的部分。

Public Class PropertyNest
    'Huge bunch of functions that we dont need to look at

    '#######################

    Public  _wasLoadedFromFile As Boolean = False
    Private _port As Integer = 201
    Private _httpPort As Integer = 202
    Private _rootFolder As String = "\appstreamRoot"
    Private _adminUser As String = "Admin"
    Private _adminPass As String = "21232F297A57A5A743894A0E4A801FC3" 'admin
    Private _appstreamServerType As appStreamServerType = appStreamServerType.http
    Private _useDES3forserver As Boolean = True
    Private _encDES3pswd As String = "21232F297A57A5A743894A0E4A801FC3" 'admin

    'Properties and descriptors for 'PropertyGrid' object go here \|/
    '=================================================================

End Class

它在主窗口中声明, serverMain 就像这样,

Public Shared Property_Nest As AdvancedSettings.PropertyNest

并稍后在此处初始化,

    If settingsfilename = "" Then
        Property_Nest = New AdvancedSettings.PropertyNest()
    Else
        If propFileEncrypted = False Then
            WriteLog("From unprotected file...", False)
            Try
                Property_Nest = AdvancedSettings.PropertyNest.LoadFrom(settingsfilename)
            Catch ex As Exception
                WriteLog("FAILED! Making default property nest...")
                Property_Nest = New AdvancedSettings.PropertyNest()
            End Try
        Else
            WriteLog("From encrypted file...", False)
            Try
                Property_Nest = AdvancedSettings.PropertyNest.LoadFrom(settingsfilename, True, propFilePswd)
            Catch ex As Exception
                WriteLog("FAILED! Making default property nest...", False)
                Property_Nest = New AdvancedSettings.PropertyNest()
            End Try

        End If
    End If

这一切都很好。从保存到的文件中加载它是问题所在。在PropertyNest类中,我有两个像这样编程的序列化器: (对不起它,可以使用TrippleDES加密序列化产品)

    Public Sub SaveAs(ByVal filename As String, Optional ByVal Encrypted As Boolean = False)
        Dim extra As String
        If Encrypted = True Then : extra = "Encrypted? : Yes." : Else : extra = "Encrypted? : No."
        End If
        If filename = Nothing Then
            Exit Sub
        End If
        writeLog2("Saving Property Nest to: " & filename & vbCrLf & extra, False)

        If Encrypted = False Then
            Dim writer As New Xml.Serialization.XmlSerializer(GetType(PropertyNest))
            Dim file As New System.IO.StreamWriter(filename)
            writer.Serialize(file, Me)
            file.Close()
        Else
            Dim writer As New Xml.Serialization.XmlSerializer(GetType(PropertyNest))
            Dim memstream As New System.IO.MemoryStream
            writer.Serialize(memstream, Me)
            memstream.Seek(0, IO.SeekOrigin.Begin)
            Dim file As New System.IO.StreamWriter(filename)
            Dim memstreamReader As New System.IO.StreamReader(memstream)
            Do
                file.WriteLine(serverMain.admin_des3Manager.Encrypt(memstreamReader.ReadLine()))
            Loop Until memstreamReader.EndOfStream = True
            file.Close()
        End If
        writeLog2("OK!")
    End Sub


    Shared Function LoadFrom(ByVal filename As String, Optional ByVal EncryptedWithPswd As Boolean = False, Optional ByVal Password As String = "") As PropertyNest
        Dim reader As New Xml.Serialization.XmlSerializer(GetType(PropertyNest))
        Dim file As New System.IO.StreamReader(filename)
        Dim newPropNest As PropertyNest
        If EncryptedWithPswd = False Then
            newPropNest = reader.Deserialize(file) 'Error in XML Document(11, 3)
        Else
            If Password = "" Then
                Dim convertedStream As New System.IO.MemoryStream
                Dim convertedWriter As New System.IO.StreamWriter(convertedStream)
                Do
                    convertedWriter.WriteLine(serverMain.admin_des3Manager.Decrypt(file.ReadLine()))
                Loop Until file.EndOfStream = True
                convertedWriter.Close()
                newPropNest = reader.Deserialize(convertedStream)
            Else
                Dim tempDES3 As New DES3(Password)
                Dim convertedStream As New System.IO.MemoryStream
                Dim convertedWriter As New System.IO.StreamWriter(convertedStream)
                Do
                    convertedWriter.WriteLine(tempDES3.Decrypt(file.ReadLine()))
                Loop Until file.EndOfStream = True
                convertedWriter.Close()
                newPropNest = reader.Deserialize(convertedStream)
            End If
        End If
        Return newPropNest
    End Function

我在那里标记了错误。

呼。几乎完成了。

我现在只担心未加密,所以我尽了自己的责任来保存一个自定义的非默认属性嵌套,它写入文件就像这样:

<?xml version="1.0" encoding="utf-8"?>
    <PropertyNest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <_wasLoadedFromFile>false</_wasLoadedFromFile>
    <ServerPort>2010</ServerPort>
    <AdminUser>Matthew</AdminUser>
    <AdminPasswordHash>21232F297A57A5A743894A0E4A801FC3</AdminPasswordHash>
    <AppStreamPort>2020</AppStreamPort>
    <AppStream_ServerRoot>\appstreamRoot</AppStream_ServerRoot>
    <UseDES3>true</UseDES3>
    <EncDES3Pswd>21232F297A57A5A743894A0E4A801FC3</EncDES3Pswd>
</PropertyNest>

真棒!现在....如果你看看' LoadFrom '功能,你会看到我评论了我收到错误的行...我没有看到11,3的错误。请帮忙!

非常感谢:D

1 个答案:

答案 0 :(得分:0)

您的XML是有效的,但是您需要反序列化的类应该是这样的,根据visual studio,将XML复制到剪贴板,转到编辑菜单,粘贴特殊和过去的XML,因为类给你这个,给尝试看看它是否有效,如果需要,可以使用ac#to vb转换器更改为VB。

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class PropertyNest
{

    private bool _wasLoadedFromFileField;

    private ushort serverPortField;

    private string adminUserField;

    private string adminPasswordHashField;

    private ushort appStreamPortField;

    private string appStream_ServerRootField;

    private bool useDES3Field;

    private string encDES3PswdField;

    /// <remarks/>
    public bool _wasLoadedFromFile
    {
        get
        {
            return this._wasLoadedFromFileField;
        }
        set
        {
            this._wasLoadedFromFileField = value;
        }
    }

    /// <remarks/>
    public ushort ServerPort
    {
        get
        {
            return this.serverPortField;
        }
        set
        {
            this.serverPortField = value;
        }
    }

    /// <remarks/>
    public string AdminUser
    {
        get
        {
            return this.adminUserField;
        }
        set
        {
            this.adminUserField = value;
        }
    }

    /// <remarks/>
    public string AdminPasswordHash
    {
        get
        {
            return this.adminPasswordHashField;
        }
        set
        {
            this.adminPasswordHashField = value;
        }
    }

    /// <remarks/>
    public ushort AppStreamPort
    {
        get
        {
            return this.appStreamPortField;
        }
        set
        {
            this.appStreamPortField = value;
        }
    }

    /// <remarks/>
    public string AppStream_ServerRoot
    {
        get
        {
            return this.appStream_ServerRootField;
        }
        set
        {
            this.appStream_ServerRootField = value;
        }
    }

    /// <remarks/>
    public bool UseDES3
    {
        get
        {
            return this.useDES3Field;
        }
        set
        {
            this.useDES3Field = value;
        }
    }

    /// <remarks/>
    public string EncDES3Pswd
    {
        get
        {
            return this.encDES3PswdField;
        }
        set
        {
            this.encDES3PswdField = value;
        }
    }
}