Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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 复制我的.Settings_Vb.net_Clone_Serializable_My.settings - Fatal编程技术网

Vb.net 复制我的.Settings

Vb.net 复制我的.Settings,vb.net,clone,serializable,my.settings,Vb.net,Clone,Serializable,My.settings,VB2012:我正在尝试克隆.Settings类(而不是副本)。我尝试了在这里找到的DeepClone函数 Public Function DeepClone(Of T)(ByVal a As T) As T Using stream As New System.IO.MemoryStream Dim formatter As New BinaryFormatter formatter.Serialize(stream, a) stream

VB2012:我正在尝试克隆.Settings类(而不是副本)。我尝试了在这里找到的DeepClone函数

Public Function DeepClone(Of T)(ByVal a As T) As T
    Using stream As New System.IO.MemoryStream
        Dim formatter As New BinaryFormatter
        formatter.Serialize(stream, a)
        stream.Position = 0
        Return DirectCast(formatter.Deserialize(stream), T)
    End Using
End Function
但这导致了一个例外

在程序集中键入“MyCompany.MyDept.TestApp.My.MySettings” “TestApp,版本=10.1.0.3,区域性=中性,PublicKeyToken=null”是 未标记为可序列化

由于设置是一个类,并保存为XML,因此必须有一种方法来克隆它们,还是我只是选错了树


~AGP

简单的答案是不要使用BinaryFormatter。改用XmlSerializer、DataContractSerializer或JsonSerializer


(通常,
Serializable
属性和使用它的东西都不推荐。)

简单的答案是不要使用BinaryFormatter。改用XmlSerializer、DataContractSerializer或JsonSerializer


(通常,
Serializable
属性和使用它的东西是不推荐的。)

不清楚为什么需要设置的“副本”。由于
My.Settings
是一个
Shared
属性,因此它包含的设置可以全局访问。但是,由于它在第一次读取设置属性时会从配置文件中加载所有设置,如果您确实需要内存中的第二个副本,您可以创建
MySettings
类的新实例,然后让它再次从文件中填充自己。例如,如果有一个名为
ClientName
String
设置,则可以执行以下操作:

Dim copy As New My.MySettings()
Dim clientName As String = copy.ClientName

不清楚您为什么需要设置的“副本”。由于
My.Settings
是一个
Shared
属性,因此它包含的设置可以全局访问。但是,由于它在第一次读取设置属性时会从配置文件中加载所有设置,如果您确实需要内存中的第二个副本,您可以创建
MySettings
类的新实例,然后让它再次从文件中填充自己。例如,如果有一个名为
ClientName
String
设置,则可以执行以下操作:

Dim copy As New My.MySettings()
Dim clientName As String = copy.ClientName

克隆它的方式是通过二进制序列化,这需要
Serializable
属性,以便它可以序列化所有非公共字段。XML序列化只序列化公共字段,这就是它不需要该属性的原因。浅层克隆对您来说还不够吗?好的,我可以提供一个示例。我会尝试一切。
My.Settings.MemberwiseClone()
将创建一个浅拷贝(如果在
My.Settings
中存在这样的方法)。这对于My.Settings是不存在的。您克隆它的方式是通过二进制序列化,这需要
Serializable
属性,以便它可以序列化所有非公共字段。XML序列化只序列化公共字段,这就是它不需要该属性的原因。浅层克隆对您来说还不够吗?好的,我可以提供一个示例。我会尝试任何东西。
My.Settings.MemberwiseClone()
将创建一个浅层副本(如果在
My.Settings
中存在这样的方法)。这对于My.Settings是不存在的。我在这里尝试了XML方法,它说“MyCompany.MyDept.TestApp.My.MySettings由于其保护级别而无法访问。只能处理公共类型。”。因此,我将尝试另一种方法。在这里尝试了XML方法,它说“MyCompany.MyDept.TestApp.My.MySettings由于其保护级别而无法访问。只能处理公共类型。”。因此,我们将尝试另一种方法。