VB.Net-序列化列表属性

时间:2018-12-14 10:28:38

标签: vb.net list serialization properties

我创建了三个类:

课程 阶段 cActivity

现在,我正在尝试序列化列表属性,并为我的两个类设置提供了以下代码:

cLesson.vb

<Serializable()> _
<System.Xml.Serialization.XmlInclude(GetType(List(Of cStage)))> _
Public Class cLesson
    Private lStages As New List(Of cStage)

    Public Sub addStage(sStage As String)
        Dim oStage As New cStage

        oStage.Title = sStage

        lStages.Add(oStage)
    End Sub

    Public Sub listStages()
        For Each oStage In lStages
            MsgBox(oStage.Title)
        Next
    End Sub
End Class

cStage.vb

<Serializable> _
Public Class cStage
    Private sTitle As String

    Public Property Title() As String
        Get
            Return sTitle
        End Get
        Set(ByVal Value As String)
            sTitle = Value
        End Set
    End Property
End Class

Form1.vb-序列化调用

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim xml_serializer As New Xml.Serialization.XmlSerializer(GetType(cLesson))

    'Word document pointers
    Dim pDoc As String

    'Open master document
    Dim fdFile As SaveFileDialog = New SaveFileDialog

    fdFile.Title = "Save Reading Resource"
    fdFile.Filter = "Dat Files|*.dat"
    fdFile.RestoreDirectory = True

    If fdFile.ShowDialog = Windows.Forms.DialogResult.OK Then
        pDoc = fdFile.FileName
        Dim stream_writer As New StreamWriter(pDoc, False)

        Try
            xml_serializer.Serialize(stream_writer, oLesson)
            stream_writer.Close() ' close the file
        Catch ex As Exception
            MsgBox(ex.InnerException.ToString)
        End Try
    End If
End Sub

但是,当我运行该程序时,没有让list属性出现在XML中。

最后,我想上一堂课,其中列出了各个阶段,每个阶段可以有一个活动列表。

任何建议将不胜感激。我在网上看了很多东西,却找不到任何帮助。

更新1

将列表公开可以使其序列化。但是,我希望它是私有的。

公共步骤作为cStage的新列表

1 个答案:

答案 0 :(得分:-1)

XML序列化仅适用于标记为Public的字段和属性。引用官方文档文章Introducing XML Serialization

  

XML序列化仅将对象的公共字段和属性值序列化为XML流。

     

(...)

     

XML序列化不会转换方法,索引器,私有字段或只读属性(只读集合除外)。要序列化所有对象的公共和私有字段和属性,请使用DataContractSerializer而不是XML序列化。

因此,您也可以切换到DataContractSerializer来序列化私有字段,但是要使其与常规XML序列化(支持XML属性)一起使用,唯一的方法是将字段的声明更改为:

Public lStages As New List(Of cStage)