2013-08-22 62 views
0

我在博客中使用SerializableDictionary類,我也在使用一些複雜類型進行序列化。不幸的是,我收到一個錯誤,不知道如何解決這個問題。序列化字典<string,object>包含列表<string>作爲值

有一點需要注意的是,我使用的是單聲道,因爲我使用的是Unity3D。我不知道這是否使這個問題不同,我還沒有測試.net是否也返回這個錯誤。

這是堆棧跟蹤的上半部分:

InvalidOperationException: The type of the argument object 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' is not primitive.

System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive (System.String name, System.String ns, System.Object o, Boolean 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(); 
     } 
    } 
} 

UPDATE
我在.NET中創建一個測試程序,它告訴我,{「類型系統.Collections.Generic.List`1 [[System.String,...]]可能不在此上下文中使用。「}

我已經更新了上面的示例代碼。

回答

0

首先檢查在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:

「錯誤」 是在SerializableDictionary類ValueSerializer:

protected XmlSerializer ValueSerializer 
{ 
    get 
    { 
     if (valueSerializer == null) 
     { 
      valueSerializer = new XmlSerializer(typeof(TVal)); 
     } 
     return valueSerializer; 
    } 
} 

如果設置對象TVal,XmlSerializer的不能序列化列表。

更新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>)); 
+0

添加typeof(列表)沒有幫助不幸。 – Marnix

+0

恐怕我們不能幫助你沒有產生錯誤的內部類的樣本。 – mswietlicki

+0

我用新的示例代碼更新了我的問題,該代碼返回錯誤。 – Marnix

相關問題