Vb.net 某些数据类型赢得';无法保存在我的设置中
我在获取自定义对象、Vb.net 某些数据类型赢得';无法保存在我的设置中,vb.net,visual-studio-2015,application-settings,Vb.net,Visual Studio 2015,Application Settings,我在获取自定义对象、System.Object和Microsoft.VisualBasic.Collection以保存在My.Settings中时遇到问题。这些都是未在下拉菜单中或通过点击浏览列出的对象。任何其他预定义对象都很好用。我最终通过序列化来解决问题。我将对象转换为字节数组,然后将字节数组转换为字符串。只需在需要拉取设置时反转即可。记住将类标记为可序列化 Imports System.IO Imports System.Runtime.Serialization.Formatters.B
System.Object
和Microsoft.VisualBasic.Collection
以保存在My.Settings
中时遇到问题。这些都是未在下拉菜单中或通过点击浏览列出的对象。任何其他预定义对象都很好用。我最终通过序列化来解决问题。我将对象转换为字节数组,然后将字节数组转换为字符串。只需在需要拉取设置时反转即可。记住将类标记为可序列化
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Module SettingsSerialization
Public Function ObjectToByteArray(ByVal Obj As Object) As Byte()
Dim bf As BinaryFormatter = New BinaryFormatter()
Using ms As MemoryStream = New MemoryStream()
bf.Serialize(ms, Obj)
Return ms.ToArray()
End Using
End Function
Public Function ByteArrayToString(ByVal ByteArray As Byte()) As String
Return Convert.ToBase64String(ByteArray)
End Function
Public Function StringToByteArray(ByVal Str As String) As Byte()
Return Convert.FromBase64String(Str)
End Function
Public Function ByteArrayToObject(ByVal ByteArray As Byte()) As Object
Dim bf As BinaryFormatter = New BinaryFormatter
Using ms As MemoryStream = New MemoryStream
ms.Write(ByteArray, 0, ByteArray.Length)
ms.Seek(0, SeekOrigin.Begin)
Return bf.Deserialize(ms)
End Using
End Function
End Module
用法示例:
'Getting the setting.
Dim myclass As CustomClass = SettingsSerialization.ByteArrayToObject(SettingsSerialization.StringToByteArray(My.Settings.CustomClass))
'Properly setting and saving.
My.Settings.CustomClass = SettingsSerialization.ByteArrayToString(SettingsSerialization.ObjectToByteArray(CustomClass))
My.Settings.Save()
我希望能够传递任何对象,否则我必须重载函数。
泛型意味着永远不必将事物作为对象装箱:
Private Function SerializeToB64(Of T)(item As T) As String
Using ms As New MemoryStream
Dim bf As New BinaryFormatter
bf.Serialize(ms, item)
Return Convert.ToBase64String(ms.ToArray())
End Using
End Function
Private Function DeSerializeFromB64(Of T)(data As String) As T
Using ms As New MemoryStream(Convert.FromBase64String(data))
Dim bf As New BinaryFormatter
' serializer creates the new object
Dim newT As T = CType(bf.Deserialize(ms), T)
Return newT
End Using
End Function
用法:
Dim A As New Animal With {.Name = "Gizmo", .Species = "Mugwai"}
Dim b64 = SerializeToB64(A)
Dim A2 = DeSerializeFromB64(Of Animal)(b64)
Console.WriteLine("Animal name: {0}, species: {1}", A2.Name, A2.Species)
如果要保存多个对象,您可以创建一个排序为“Mailer”的对象来保存所有对象,并一次性序列化它们:
<Serializable>
Public Class SerializingMailer
Public Property AnimalItem As Animal
Public Property FooItem As Foo
Public Property BarItem As Bar
' some serializers require a simple ctor
Public Sub New()
End Sub
End Class
公共类序列化邮件程序
公共财产动物作为动物
作为Foo的公共属性Foo项
公共财产酒吧
'某些序列化程序需要一个简单的构造函数
公共分新()
端接头
末级
请注意,与其将B64字符串返回给My.Settings
,您只需使用FileStream
将它们保存到磁盘,因为它们不受支持。您是说根据假设还是实际列出了它们?我搜索了又搜索,结果发现很少。序列化意味着将对象的属性保存到某种符号中,然后可以从中重新创建它。无论您在对象
中放入什么,都会丢失它所具有的所有特定属性,因为这些属性没有为对象
定义。和那个糟糕的VB集合一样,因为它只能存储Object
vs具体类型。是的,但我从来没有提到序列化。根据您所说的,我假设在保存设置时会发生这种情况?a)如果您使用BF,那么当您可以使用实际类型时,为什么要将传递/序列化为对象?b) 因为结果是二进制的,而不是ASCII编码,所以Base64字符串将是一个更好的选择(或者与其说是memstream,不如自己将其写入磁盘)。我希望能够传递任何对象,否则我必须重载函数。此外,当我检索我的对象时,我还是创建了它的一个实例。用Base64编码更新了我的答案。我看不出我们的方法有什么不同。他们似乎都有相同的结果。对象似乎足够通用。写入磁盘意味着更少的可移植性。我写入设置是为了避免写入磁盘。反序列化时,它们实际上是不同的。使用泛型,返回的类型是正确的(Animal
,Employee
无论什么)。在对象上获取动物
属性的唯一方法是使用return或late binding(这反过来意味着选项Strict处于禁用状态)<代码>作为对象
是不可取的,