C# 将词典序列化<;字符串,对象>;包含列表<;字符串>;作为价值
我正在使用博客中的一个类,并且还使用一些复杂类型来序列化。不幸的是,我收到一个错误,不知道如何解决这个问题 需要注意的是,我使用的是Mono,因为我使用的是Unity3D。我不知道这是否会使这个问题有所不同,我还没有测试.net是否也返回这个错误 这是stacktrace的上部: 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)C# 将词典序列化<;字符串,对象>;包含列表<;字符串>;作为价值,c#,serialization,C#,Serialization,我正在使用博客中的一个类,并且还使用一些复杂类型来序列化。不幸的是,我收到一个错误,不知道如何解决这个问题 需要注意的是,我使用的是Mono,因为我使用的是Unity3D。我不知道这是否会使这个问题有所不同,我还没有测试.net是否也返回这个错误 这是stacktrace的上部: InvalidOperationException:参数对象的类型 'System.Collections.Generic.List`1[[System.String,mscorlib, 版本=2.0.0.0,区域性=
名称空间Foo
{
班级计划
{
静态void Main(字符串[]参数)
{
Foo f=新的Foo();
字符串结果=f.Serialize();
控制台写入线(结果);
Console.ReadLine();
}
}
福班
{
私有序列化字典dict;
公共食物(
{
dict=新的SerializableDictionary();
dict.Add(“list”,newlist(){“test1”,“test2”});
}
公共字符串序列化()
{
XmlSerializer x=新的XmlSerializer(dict.GetType(),新类型[]{typeof(List)});
StringWriter w=新的StringWriter();
x、 序列化(w,dict);
返回w.ToString();
}
}
}
更新:我在.NET中创建了一个测试程序,它告诉我{“type System.Collections.Generic.List`1[[System.String,…]]不能在此上下文中使用。”}
我已经更新了上面的示例代码。在SerializableDictionary中指定值类型后,首先检查错误是否会持续 另外,指定内部类型可能有助于:
var x = new XmlSerializer(myobjects.GetType(), new[] { typeof(List<string>) } );
若将对象设置为TVal,XmlSerializer将无法序列化列表
更新3:
如果不知道值类型,可以尝试在额外类型中指定所有可能的复杂类型:
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal),
new[]
{
typeof(List<string>),
typeof(List<int>)
});
}
return valueSerializer;
}
}
受保护的XmlSerializer ValueSerializer
{
得到
{
if(valueSerializer==null)
{
valueSerializer=新的XmlSerializer(typeof(TVal),
新[]
{
类型(列表),
类型(列表)
});
}
返回值序列化器;
}
}
或者使用一些动态框架,如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>));
var dict=newdictionary();
dict.Add(“list”,newlist(){“test1”,“test2”});
var str=JsonConvert.SerializeObject(dict);
控制台写入线(str);
var dict2=JsonConvert.DeserializeObject(str,typeof(Dictionary));
不幸的是,添加typeof(List)没有帮助。如果没有生成错误的内部类示例,恐怕我们无法帮助您。我已经用返回错误的新示例代码更新了我的问题。我看到了ValueSerializer
,似乎我可以通过为每个值创建一个新的XmlSerializer
来解决这个问题,但是在反序列化()
过程中,对于我想从字典中读取的每个值,几乎不可能找到新XmlSerializer的类型。所以SerializableDictionary中存储了许多类型的值?
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal));
}
return valueSerializer;
}
}
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal),
new[]
{
typeof(List<string>),
typeof(List<int>)
});
}
return valueSerializer;
}
}
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>));