Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何修复反序列化错误?_Vb.net - Fatal编程技术网

Vb.net 如何修复反序列化错误?

Vb.net 如何修复反序列化错误?,vb.net,Vb.net,嗨,大家好 我有一个我已经做了几个月的计划。它的基本背景是,它应该能够在后台为windows传输和安装应用程序,就像iCloud为应用程序所做的那样 总之,我正在使用序列化/反序列化方法来保存属性,例如管理员用户名和密码哈希、目录、端口等 我有一个名为“PropertyNest”的类,它表示内存分配的属性和链接。我将把它简化为XMLSerializer查看和保存的部分 Public Class PropertyNest 'Huge bunch of functions that we d

嗨,大家好

我有一个我已经做了几个月的计划。它的基本背景是,它应该能够在后台为windows传输和安装应用程序,就像iCloud为应用程序所做的那样

总之,我正在使用序列化/反序列化方法来保存属性,例如管理员用户名和密码哈希、目录、端口等

我有一个名为“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

您的XML是有效的,但是您需要反序列化的类,根据visual studio,应该是这样的,将您的XML复制到剪贴板,转到“编辑”菜单,粘贴特殊的和过去的XML作为类给您的信息,试试看它是否有效,如果需要,您可以使用c到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;
        }
    }
}

正如@saj在他的C!回答,您需要将PropertyNest的属性设置为公共的和可写的,以便将反序列化的XML写入对象。发布PropertyNest类和appStreamServerType枚举的公共属性代码,以便我可以编译它,去掉加载的加密部分。这些属性确实是公共的,我没有包括它们,因为它们只是直接返回到那些声明的Get/set。