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

时间:2009-07-11 20:20:11

标签: 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

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

1 个答案:

答案 0 :(得分:5)

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

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

修改

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