![](/img/trans.png)
[英]Alternative to string.ToUpper() with StringComparison or similar, that fully preserve behavior
[英]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.