Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将词典序列化<;字符串,对象>;包含列表<;字符串>;作为价值_C#_Serialization - Fatal编程技术网

C# 将词典序列化<;字符串,对象>;包含列表<;字符串>;作为价值

C# 将词典序列化<;字符串,对象>;包含列表<;字符串>;作为价值,c#,serialization,C#,Serialization,我正在使用博客中的一个类,并且还使用一些复杂类型来序列化。不幸的是,我收到一个错误,不知道如何解决这个问题 需要注意的是,我使用的是Mono,因为我使用的是Unity3D。我不知道这是否会使这个问题有所不同,我还没有测试.net是否也返回这个错误 这是stacktrace的上部: InvalidOperationException:参数对象的类型 'System.Collections.Generic.List`1[[System.String,mscorlib, 版本=2.0.0.0,区域性=

我正在使用博客中的一个类,并且还使用一些复杂类型来序列化。不幸的是,我收到一个错误,不知道如何解决这个问题

需要注意的是,我使用的是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)

名称空间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>));