序列化字典<;字符串,对象>;包含列表<;字符串>;作为值
本文关键字:gt 字符串 lt 列表 字典 序列化 对象 包含 | 更新日期: 2023-09-27 18:28:42
我使用博客中的SerializableDictionary
类,还使用一些复杂类型进行序列化。不幸的是,我收到一个错误,不知道如何解决这个问题。
需要注意的一点是,我正在使用Mono,因为我使用的是Unity3D。我不知道这是否会使这个问题有所不同,我还没有测试.net是否也会返回这个错误。
这是堆叠通道的上部:
InvalidOperationException:参数对象的类型'System.Collections.Generic.List`1[[System.String,mscorlib,版本=2.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089]不是原始的。
System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(System.String名称,System.String ns,System.Object o,布尔值xsiType)
namespace Foo
{
class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
string result = f.Serialize();
Console.WriteLine(result);
Console.ReadLine();
}
}
class Foo
{
private SerializableDictionary<string, object> dict;
public Foo()
{
dict = new SerializableDictionary<string, object>();
dict.Add("list", new List<string>() { "test1", "test2" });
}
public string Serialize()
{
XmlSerializer x = new XmlSerializer(dict.GetType(), new Type[] {typeof(List<string>)});
StringWriter w = new StringWriter();
x.Serialize(w, dict);
return w.ToString();
}
}
}
更新:
我在.NET中创建了一个测试程序,它告诉我{"类型System.Collections.Generic.List`1[[System.String,…]]不能在此上下文中使用。"}.
我已经更新了上面的示例代码。
在SerializableDictionary中指定值类型后,首先检查错误是否会持续存在。
指定内部类型也可能有所帮助:
var x = new XmlSerializer(myobjects.GetType(), new[] { typeof(List<string>) } );
附言:你也可以看看Json.Net;)
更新1:
如果您为SerializableDictionary代码指定值类型,示例代码将起作用:
...
private SerializableDictionary<string, List<string>> dict;
public Foo()
{
dict = new SerializableDictionary<string, List<string>>();
dict.Add("list", new List<string>() { "test1", "test2" });
}
更新2:
"Bug"在ValueSerializer:的SerializableDictionary类中
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal));
}
return valueSerializer;
}
}
如果将对象设置为TVal,XmlSerializer将无法序列化List。
更新3:
如果你不知道值类型,你可以尝试在额外的类型中指定所有可能的复杂类型:
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal),
new[]
{
typeof(List<string>),
typeof(List<int>)
});
}
return valueSerializer;
}
}
或者使用一些动态框架,如Json.NET:
var dict = new Dictionary<string, object>();
dict.Add("list", new List<string>() { "test1", "test2" });
var str = JsonConvert.SerializeObject(dict);
Console.WriteLine(str);
var dict2 = JsonConvert.DeserializeObject(str, typeof(Dictionary<string, object>));