You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将List(Of String)保存至Visual Studio 2017的My.Settings?

在Visual Studio 2017中保存List(Of String)到My.Settings的解决方案

这个问题我之前也碰到过,My.Settings默认确实不直接支持泛型List(Of String)——因为VS的设置编辑器只列出了部分可直接编辑、序列化的类型,泛型列表不在其中,强行赋值自然会因为序列化逻辑不兼容导致崩溃。下面给你两个靠谱的解决办法:

方法一:用原生支持的StringCollection(推荐)

System.Collections.Specialized.StringCollection是My.Settings原生支持的类型,和List(Of String)用法非常接近,直接就能适配设置系统:

步骤1:添加StringCollection类型的设置

  1. 右键项目 → 属性 → 切换到「设置」标签页
  2. 点击空白行,设置名称(比如Times),类型选择System.Collections.Specialized.StringCollection,范围选「用户」,默认值可以留空(或者点击编辑按钮初始化几个元素)

步骤2:修改代码适配StringCollection

创建和赋值的代码改成这样:

' 创建StringCollection并添加元素
Dim Parameters As New System.Collections.Specialized.StringCollection()
Parameters.Add("Item1")
Parameters.Add("Item2")

' 保存到设置并持久化
My.Settings.Times = Parameters
My.Settings.Save() ' 必须调用Save才会把设置写入文件

读取设置的代码:

Dim Times As New System.Collections.Specialized.StringCollection()
' 先判断是否为空,避免空引用错误
If My.Settings.Times IsNot Nothing Then
    Times = My.Settings.Times
End If

如果需要和List(Of String)互转,也很简单:

' StringCollection转List(Of String)
Dim listFromSettings As List(Of String) = My.Settings.Times.Cast(Of String)().ToList()

' List(Of String)转StringCollection
Dim stringCol As New System.Collections.Specialized.StringCollection()
stringCol.AddRange(list.ToArray())

方法二:序列化List(Of String)为字符串存储

如果你坚持要用List(Of String),可以把它序列化成JSON或XML字符串,存到String类型的设置里,读取时再反序列化回来:

步骤1:添加String类型的设置

在设置页面添加一个名称为TimesList、类型为String的用户设置,默认值留空。

步骤2:用JSON序列化(需要Newtonsoft.Json)

先通过NuGet安装Newtonsoft.Json包,然后用以下代码:

保存设置:

Dim Parameters As New List(Of String) From {"Item1", "Item2"}
' 序列化为JSON字符串
My.Settings.TimesList = Newtonsoft.Json.JsonConvert.SerializeObject(Parameters)
My.Settings.Save()

读取设置:

Dim Times As List(Of String) = New List(Of String)()
If Not String.IsNullOrEmpty(My.Settings.TimesList) Then
    ' 反序列化为List(Of String)
    Times = Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of String))(My.Settings.TimesList)
End If

步骤3:用.NET原生XmlSerializer(无需额外包)

如果不想用第三方库,也可以用.NET自带的XmlSerializer:

保存设置:

Dim Parameters As New List(Of String) From {"Item1", "Item2"}
Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(List(Of String)))
Using writer As New System.IO.StringWriter()
    serializer.Serialize(writer, Parameters)
    My.Settings.TimesList = writer.ToString()
End Using
My.Settings.Save()

读取设置:

Dim Times As List(Of String) = New List(Of String)()
If Not String.IsNullOrEmpty(My.Settings.TimesList) Then
    Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(List(Of String)))
    Using reader As New System.IO.StringReader(My.Settings.TimesList)
        Times = DirectCast(serializer.Deserialize(reader), List(Of String))
    End Using
End If

为什么之前的尝试无效?

  • String类型只能存单个字符串,没法存列表;
  • ListDictionary是键值对结构,和你的字符串列表需求不匹配;
  • 直接给My.Settings赋值List(Of String)时,VS的设置系统无法正确序列化泛型对象,导致程序崩溃。

内容的提问来源于stack exchange,提问作者Sinusoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:19:06