0

私はSerializableDictionaryブログのクラスを使用しており、シリアル化するためにいくつかの複雑な型も使用しています。残念ながら、エラーが表示され、これを解決する方法がわかりません。

注意すべきことの 1 つは、Unity3D を使用しているため、Mono を使用していることです。これによりこの問題が異なるかどうかはわかりません.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、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();
        }
    }
}

更新:
.NET でテスト プログラムを作成したところ、{"型 System.Collections.Generic.List`1[[System.String,...]] はこのコンテキストでは使用できない可能性がある" と表示されます。 } .

上記のサンプルコードを更新しました。

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:

「バグ」は、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 に答える