尝试使用VB.net

时间:2016-12-05 17:15:25

标签: xml vb.net serialization visual-studio-2015

我是Visual Studio 2015(VB)的XML初学者。反序列化将适用于valueA和valueB。但帐户是空的。我不明白这个问题。我能做什么?或者,对这个XML文件进行反序列化的正确方法是什么?如何在vb中访问var?感谢名单!!!

我已关注XML文件:

<?xml version="1.0" encoding="utf-16"?>
<clsSettings>
    <valueA>20</valueA>
    <valueB>5</valueB>
    <Accounts>
        <Account>
            <User>tralala</User>
            <Pw>tralala</Pw>
        </Account>
        <Account>
            <User>triliki</User>
            <Pw>trierer</Pw>
        </Account>
    </Accounts>
</clsSettings>

这是我的班级:

Public Class clsSettings
    Public valueA As String
    Public valueB As String
    Public MyAccounts As Accounts
End Class

Public Class Accounts
    Public MyAccount As List(Of Account)
End Class

Public Class Account
    Public User As String
    Public Pw As String
End Class

她就是代码:

    Dim objSerializer As XmlSerializer
        Dim objStream As System.IO.FileStream

        If My.Computer.FileSystem.FileExists("settings.xml") Then
            objStream = New System.IO.FileStream("settings.xml", IO.FileMode.Open)
            objSerializer = New XmlSerializer(GetType(clsSettings))
            Try
                Settings = CType(objSerializer.Deserialize(objStream), clsSettings)
                readSettings()
            Catch ex As InvalidOperationException
                SetText(txt_status, "XML ERROR " + ex.Message)

            Catch ex As SerializationException
                SetText(txt_status, "XML ERROR " + ex.Message)

            Catch ex As IOException
                SetText(txt_status, "XML IO ERROR " + ex.Message)

            Finally
                objStream.Close()
            End Try
end if

2 个答案:

答案 0 :(得分:1)

如果您在XML中使用Visual Studio并选择&#34;编辑&#34;您可以让Visual Studio为您的XML创建类。 - &GT; &#34;粘贴特殊&#34; - &GT; &#34;将XML粘贴为类&#34;。我在一个新的类文件中做到了

'''<remarks/>
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True),
System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=False)>
Partial Public Class clsSettings

    Private valueAField As Byte

    Private valueBField As Byte

    Private accountsField() As clsSettingsAccount

    '''<remarks/>
    Public Property valueA() As Byte
        Get
            Return Me.valueAField
        End Get
        Set
            Me.valueAField = Value
        End Set
    End Property

    '''<remarks/>
    Public Property valueB() As Byte
        Get
            Return Me.valueBField
        End Get
        Set
            Me.valueBField = Value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlArrayItemAttribute("Account", IsNullable:=False)>
    Public Property Accounts() As clsSettingsAccount()
        Get
            Return Me.accountsField
        End Get
        Set
            Me.accountsField = Value
        End Set
    End Property
End Class

'''<remarks/>
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
Partial Public Class clsSettingsAccount

    Private userField As String

    Private pwField As String

    '''<remarks/>
    Public Property User() As String
        Get
            Return Me.userField
        End Get
        Set
            Me.userField = Value
        End Set
    End Property

    '''<remarks/>
    Public Property Pw() As String
        Get
            Return Me.pwField
        End Get
        Set
            Me.pwField = Value
        End Set
    End Property
End Class

请注意,它使用最小尺寸的数据类型来存储它在粘贴中看到的内容,例如&#34; ValueA&#34;已设置为Byte类型。你可能想要改变这些。

接下来,我注意到你的XML声明包括&#34; encoding =&#34; utf-16&#34;&#34;,所以我用这个编码小心地保存了你的示例数据(使用little-endian并包括BOM)。我没试过就试过了,我收到了一个错误&#34; XML文档中存在错误(0,0)&#34;。

完成所有设置后,我使用了一个简单的控制台应用程序:

Imports System.Xml.Serialization

Module Module1


    Sub X(src As String)
        Dim objSerializer As XmlSerializer

        Dim settings As New clsSettings

        If My.Computer.FileSystem.FileExists(src) Then
            Using objStream As New System.IO.FileStream(src, IO.FileMode.Open)
                objSerializer = New XmlSerializer(GetType(clsSettings))

                settings = DirectCast(objSerializer.Deserialize(objStream), clsSettings)

            End Using

        End If

        For Each el In settings.Accounts
            Console.WriteLine($"{el.User} {el.Pw}")

        Next

    End Sub

    Public Sub Main()
        Dim src = "C:\temp\SodahSample.xml"
        X(src)

        Console.ReadLine()

    End Sub

End Module

获取输出

tralala tralala
triliki trierer

因此,有两件事需要确定:首先,您的文件编码与XML声明中的内容匹配,其次,您声明的类符合XML文档中的内容。您可能会发现使用XSD file有帮助。

答案 1 :(得分:0)

您的课程与您的XML不匹配...试试这个:

Public Class clsSettings
    <DefaultValue("")>
    Public Property valueA() As String

    <DefaultValue("")>
    Public Property valueB() As String

    <XmlArrayItem("Account")>
    Public Property Accounts() As New List(Of Account)
End Class

Public Class Account
    <DefaultValue("")>
    Public Property User() As String

    <DefaultValue("")>
    Public Property Pw() As String
End Class