【问题标题】:Serializing a generic collection with XMLSerializer in VB.NET在 VB.NET 中使用 XMLSerializer 序列化泛型集合
【发布时间】:2010-11-10 00:23:33
【问题描述】:

为什么 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”是模块的名称;这是一个控制台应用程序)。

【问题讨论】:

    标签: vb.net generics xml-serialization


    【解决方案1】:

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

    将外部模块的定义更改为 Public 或将 Class User 移到模块之外,它应该可以解决您的问题。

    编辑

    正如一些人所指出的,实现这一点的最简洁的方法是将 User 类放入它自己的文件中。

    【讨论】:

    • 是的,在我看来也是如此。我的偏好是将用户类放在自己的文件中。
    • 我同意理查德的观点。通常应该避免嵌套类,经验法则是只有在 100% 确定没有其他类应该知道它的情况下才嵌套和/或隐藏一个类。由于您正在序列化该类,因此它显然打算在其他地方使用——所以您真的不希望它隐藏
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多