在VB.NET中使用XMLSerializer序列化通用集合

DWR*_*nds 4 vb.net generics xml-serialization

为什么XMLSerializer不会处理我的通用列表?

Sub Main()
    Serializing()
End Sub

<System.Serializable()> _
Public Class User
    Public Sub New()
    End Sub

    Public Sub New(ByVal Username As String, ByVal UserId As Integer)
        Name = Username
        ID = UserId
    End Sub

    Public Name As String
    Public ID As Integer
End Class

Public Sub Serializing()
    Dim Users As New List(Of User)

    Dim u As New User
    u.Name = "bob"
    u.ID = 1
    Users.Add(u)

    u.Name = "bill"
    u.ID = 2
    Users.Add(u)

    u.Name = "ted"
    u.ID = 3
    Users.Add(u)

    Dim sw As New System.IO.StringWriter
    Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(List(Of User)))
    ser.Serialize(sw, Users)

    Debug.WriteLine(sw.ToString)

End Sub
Run Code Online (Sandbox Code Playgroud)

我在"Dim ser"行上得到一个例外,说"由于其保护级别,Testing.Module1无法访问.只能处理公共类型." ("Testing是应用程序的名称,"Module1"是模块的名称;这是一个控制台应用程序).

Jar*_*Par 5

问题是您已在Module Module1中包含类User.该错误消息表明此模块的可访问性不公开.因此,User的实际可访问性不是公共的,因为它嵌套在Module中.

将外部模块的定义更改为公共或将类用户移动到模块外部,它应该可以解决您的问题.

编辑

正如几位人士指出的那样,实现这一目标的最简单方法是将User类放入其自己的文件中.

  • 好吧,它似乎对我来说也是如此.我的偏好是将用户类放在自己的文件中. (2认同)