0

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

需要注意的一点是,我使用的是 Mono,因为我使用的是 Unity3D。我不知道这是否会使这个问题有所不同,而且我还没有测试 .net 是否也返回此错误。

这是堆栈跟踪的上半部分:

InvalidOperationException:参数对象 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, 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 中创建了一个测试程序,它告诉我{"The type System.Collections.Generic.List`1[[System.String,...]] may not be used in this context." }

我已经更新了上面的示例代码。

4

1 回答 1

1

在 SerializableDictionary 中指定值类型后,首先检查错误是否仍然存在。

还指定内部类型可能会有所帮助:

var x = new XmlSerializer(myobjects.GetType(), new[] { typeof(List<string>) } );

PS:您也可以查看 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>));
于 2013-08-22T14:40:09.780 回答