如何将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类型的设置
- 右键项目 → 属性 → 切换到「设置」标签页
- 点击空白行,设置名称(比如
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
相关产品推荐
相关产品推荐

