C# 将词典序列化<;字符串,对象>;其中包含一个列表<;字符串>;?

C# 将词典序列化<;字符串,对象>;其中包含一个列表<;字符串>;?,c#,serialization,xml-serialization,invalidoperationexception,C#,Serialization,Xml Serialization,Invalidoperationexception,我发现了一个可序列化的字典,它运行得非常好: 但是每当字典中的一个对象只是一个字符串列表时,我就会遇到一个例外。NET告诉我它无法序列化它: Serialize 'C:\bin\Debug\Settings\Default.xml' : System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: There w

我发现了一个可序列化的字典,它运行得非常好:

但是每当字典中的一个对象只是一个字符串列表时,我就会遇到一个例外。NET告诉我它无法序列化它:

Serialize 'C:\bin\Debug\Settings\Default.xml' : System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] may not be used in this context.
   at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterObject.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterObject.Write2_anyType(Object o)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o)
   at ShadowBot.Classes.SerializableDictionary`2.WriteXml(XmlWriter writer) in c:\Classes\SerializableDictionary.cs:line 114
   at System.Xml.Serialization.XmlSerializationWriter.WriteSerializable(IXmlSerializable serializable, String name, String ns, Boolean isNullable, Boolean wrapped)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShadowSettings.Write2_ShadowSettings(String n, String ns, ShadowSettings o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterShadowSettings.Write3_ShadowSettings(Object o)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o)
   at Classes.XmlSerializer.Serialize(String Path, Object Object) in c:\Classes\XmlSerializer.cs:line 29
这可能吗?我想要这个功能,并假设您可以嵌套这样的对象。如果这是不可能的,有没有一种方法可以将字典写入磁盘(不必是XML),然后重新加载它,而不必为此编写自定义包装?我最初是一名mac开发人员,这种序列化非常简单,所以我可能在.NET上遗漏了一些东西

编辑:尝试奥德赛的例子时,我得到:

System.Runtime.Serialization.SerializationException: Type 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' with data contract name 'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

另一种选择是,使用
System.Runtime.Serialization.DataContractSerializer
可能会更幸运。例如:

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
dict.Add("test", new List<string>() { "t", "b" });

StringBuilder xmlString = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(xmlString))
{
    DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary<string, List<string>>));
    serializer.WriteObject(writer, dict);
}
Dictionary dict=new Dictionary();
dict.Add(“test”,new List(){“t”,“b”});
StringBuilder xmlString=新的StringBuilder();
使用(XmlWriter=XmlWriter.Create(xmlString))
{
DataContractSerializer serializer=新的DataContractSerializer(typeof(Dictionary));
serializer.WriteObject(writer,dict);
}
这将产生:

<?xml version="1.0" encoding="utf-16"?><ArrayOfKeyValueOfstringArrayOfstringty7Ep6D1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><KeyValueOfstringArrayOfstringty7Ep6D1><Key>test</Key><Value><string>t</string><string>b</string></Value></KeyValueOfstringArrayOfstringty7Ep6D1></ArrayOfKeyValueOfstringArrayOfstringty7Ep6D1>
testtb

我在序列化通用列表时也遇到过类似的问题。尝试在序列化之前将列表更改为字符串数组
string[]
,然后在反序列化之后返回到
列表。这很容易做到,可能会解决您的问题:

//List<string> to string[]
string[] sArray = sList.ToArray();

//string[] to List<string>
List<string> sList = sArray.ToList();
//列表到字符串[]
字符串[]sArray=sList.ToArray();
//要列出的字符串[]
List sList=sArray.ToList();

您是如何获得字符串的?@Geesu您的意思是,您是如何反序列化它的?否您是如何粘贴它生成的内容的?我正试图这样打印到控制台:长度始终为0
xmlString.ToString()
,使用
-子句在
之外执行,或者调用
writer.Flush()
,以确保编写器在读取字符串之前刷新。是的,我在内部执行,这就是问题所在。奇怪的是,它适用于您的示例,但适用于包含我正在获取的数据的dict:另一个异常(请参见上面的编辑)