繁体   English   中英

替代使用阵列和Redim Preserve

[英]Alternative to using Arrays and Redim Preserve

我只有一个主要要求,即所有内容都是可序列化的。

我最初想将List和Constructors与可传递的变量一起使用,这使所有内容看起来都不错,但是后来发现它们都不容易序列化。

因此,当前我正在使用Array and ReDim Preserve但是什么是存储多个项目并仍然能够序列化的好方法? 每次我走一条路时,我似乎都遇到了局限性/死胡同。

我的主课为“ MARKFILE”,其中包含多个“标记”

Public Class MARKFILE
    Private _Name As String 
    Public ReadOnly Property Name
        Get
            Return _Name
        End Get
    End Property

    Public Property _Markers() As Marker()

  Public Sub Add_Marker(ByRef Aa As String, ByRef Bb As String, Cc As Double)
        Dim Mark As New Marker
        Mark.A= Aa 
        Mark.B= Bb 
        Mark.C= Cc 

       If IsNothing(_Markers) Then
            ReDim _Markers(0)
            _Markers(_Markers.Length - 1) = Mark
        Else
            ReDim Preserve _Markers(_Markers.Length)
            _Markers(_Markers.Length - 1) = Mark
        End If

    End Sub
End Class

Public Class Marker

    Public A As String
    Public B As String
    Public C As String
    Public D As String
End Class

代码有很多问题,从它开始就不会像发布时那样编译:

Public Sub Add_Marker(ByRef Aa As String, ByRef Bb As String, Cc As Double)
    ...
    Mark.C = Cc     ' Mark.C is String, cannot assign Double To String!

因此,首先启用Option Strict。

要使List(of Marker)序列化,您需要添加一个属性:

<Serializable>
Public Class Marker
    Public Property A As String
    Public Property B As String
    Public Property C As String
    Public Property D As String
End Class

我还将使用属性(如图所示)而不是字段。 集合类也需要该属性:

<Serializable>
Public Class Markers
    Private _Name As String
    Public ReadOnly Property Name As String
        Get
            Return _Name
        End Get
    End Property

    Public Property Markers As List(Of Marker)

    Public Sub New()
        Markers = New List(Of Marker)
    End Sub

    Public Sub Add(Aa As String, Bb As String, Cc As String)

        Markers.Add(New Marker With {.A = Aa, .B = Bb, .C = Cc})

    End Sub
End Class

序列化数据很简单:

Dim col As New Markers

col.Add("A", "B", "C")

Using fs As New FileStream("C:\temp\marks.bin", FileMode.OpenOrCreate)
    Dim bf As New BinaryFormatter
    bf.Serialize(fs, col)
End Using

你可能得到的错误是不是在List东西List没有标记为可序列化。


还可以(应该)对集合类进行许多改进。 与其公开集合/列表,不如说应该有添加,删除,清除,计数,项目等类型的函数来实际管理列表,而不是仅仅保留它并将其公开。 添加也可以重载以获取Marker对象。

似乎Name属性应该在小数据类(标记)上,而不是集合上。 因为它是(ReadOnly),所以它是无用的,因为无法设置它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM