2009-07-11 7 views
4

Pourquoi XMLSerializer ne traitera-t-il pas ma liste générique?Sérialisation d'une collection générique avec XMLSerializer dans VB.NET

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 

je reçois une exception sur la ligne « Dim ser », en disant: « Testing.Module1 est inaccessible en raison de son niveau de protection. Seuls les types publics peuvent être traités. » ("Test est le nom de l'application et" Module1 "est le nom du module, il s'agit d'une application console.)

Répondre

5

Le problème est que vous avez inclus la classe User dans le Module Module1. message indique que l'accessibilité de ce module n'est pas publique, donc l'accessibilité réelle de l'utilisateur n'est pas publique car il est imbriqué dans le module

Modifiez la définition de votre module externe pour qu'il soit public ou déplacez l'utilisateur de la classe en dehors du module. module et il devrait résoudre votre problème.

EDIT

Comme plusieurs personnes l'ont souligné, le moyen le plus propre d'y parvenir est de placer la classe User dans son propre fichier.

+2

Yeap que cela semble être aussi pour moi. Ma préférence serait de mettre l'utilisateur Class dans son propre fichier. – RichardOD

+0

Je suis d'accord avec Richard. Les classes imbriquées devraient normalement être évitées, la règle empirique est seulement d'imbriquer et/ou de cacher une classe s'il y a 100% de certitude qu'aucune autre classe ne devrait en être consciente. Puisque vous êtes en train de sérialiser la classe, il est clairement destiné à être utilisé ailleurs - donc vous ne voulez vraiment pas qu'il soit caché – STW

+0

Merci pour les commentaires, tous. Cela a résolu mon problème. – DWRoelands

Questions connexes