Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 某些数据类型赢得';无法保存在我的设置中_Vb.net_Visual Studio 2015_Application Settings - Fatal编程技术网

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处于禁用状态)<代码>作为对象
是不可取的,