【问题标题】:VB.Net - Serializing a list property [duplicate]VB.Net - 序列化列表属性[重复]
【发布时间】:2019-05-15 14:46:46
【问题描述】:

我创建了三个类:

课程 cStage 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

但是,当我运行这个程序时,我没有得到 XML 中出现的列表属性。

最后,我想要一个包含阶段列表的课程,每个阶段都可以有一个活动列表。

任何建议将不胜感激。我在网上查了很多,但找不到任何帮助。

更新 1

公开列表允许它被序列化。但是,我希望它是私有的。

作为新列表的公共 lStages(Of cStage)

【问题讨论】:

  • 试试GetType(List(Of cStage))
  • 一个令人尴尬的错误 - 但仍然无法正常工作

标签: vb.net list serialization properties


【解决方案1】:

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

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

(...)

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

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

Public lStages As New List(Of cStage)

【讨论】:

  • 谢谢。应该发现那个。
  • 我以后可能会尝试创建一个公共属性,但似乎很难构建一个来满足相关需求。我可能只会公开列表并编写我需要的功能。
  • @PaulHaydock :您更喜欢Private,请参阅我在对您的问题的评论中建议的副本。
  • 感谢文森特 - 非常感谢您的帮助
  • @PaulHaydock :很高兴我能帮上忙!
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2015-12-31
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多