序列化字典<;字符串,对象>;包含列表<;字符串>;作为值

本文关键字: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>));