2009-07-11 5 views
4

なぜXMLSerializerは汎用リストを処理しないのですか?VB.NETで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 

私が言って、「薄暗いSER」のライン上の例外を取得「Testing.Module1は、その保護レベルにアクセスできません。唯一のパブリック型を処理することができます。」 ( "Testing"はアプリケーションの名前で、 "Module1"はモジュールの名前です;これはコンソールアプリケーションです)

答えて

5

問題はモジュールModule1の内部にクラスUserを含めたことです。このモジュールのアクセシビリティは公開されていないことを示しています。したがって、ユーザーの実際のアクセシビリティは、モジュール内にネストされているためパブリックではありません。

外部モジュールの定義をPublicに変更するか、あなたの問題を解決するはずです。

EDIT

いくつかの人々が指摘したように、これを達成する最もクリーンな方法は、Userクラスをそれ自身のファイルに入れることです。

+2

それは私にもあるように見える。私の好みは、独自のファイルにユーザークラスを配置することです。 – RichardOD

+0

私はリチャードに同意します。ネストされたクラスは避けなければなりません。他のクラスがそれを意識していないことが100%保証されている場合、経験則はネストしたり、クラスを隠すだけです。クラスをシリアライズしているので、他の場所で使用することを明示しています。実際には隠したくはありません。 – STW

+0

フィードバックをいただきありがとうございます。これは私の問題を解決しました。 – DWRoelands

関連する問題