2

Queue 型のプロパティを持つクラスがあります。JSON をデシリアライズしようとすると、次のエラーが発生します。

JSON で指定された型'ConsoleApplication1.Task[], ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'は'System.Collections.Generic.Queue`1[[ConsoleApplication1.Task, ConsoleApplication1, Version]と互換性がありません=1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null]]、システム、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089'。パス「Tasks.$type」、1 行目、位置 140。

以下にサンプル アプリケーションを含め、Newtonsoft.Json 4.5.10.15407 を使用しています。

List または Dictionary の代わりに Queue を使用する理由は、挿入順序を保持する必要があるためです。ドキュメントやその他の質問も検索してみましたが、具体的なものは何も見つかりませんでした。どんな助けでも大歓迎です。ありがとうございました。

namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Newtonsoft.Json;

    class Program
    {
        static void Main(string[] args)
        {
            Message message = new Message
                {
                    MessageID = 1,
                    Tasks = new Queue<Task>()
                };
            message.Tasks.Enqueue(new Task{TaskId = 1, Message = "Test1", Parameters = "Param1"});
            message.Tasks.Enqueue(new Task{TaskId = 2, Message = "Test2", Parameters = "Param2"});

            byte[] bSerialized = SerializeJsonWithPrefix(message);
            Message deserializedMessage = DeserializeJson(bSerialized, typeof (Message));
        }

        public static byte[] SerializeJsonWithPrefix(Message item)
        {
            JsonSerializerSettings jss = new JsonSerializerSettings();
            jss.TypeNameHandling = TypeNameHandling.All;
            return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(item, jss));
        }

        public static Message DeserializeJson(byte[] ueaData, Type concreteType)
        {
            JsonSerializerSettings jss = new JsonSerializerSettings();
            jss.TypeNameHandling = TypeNameHandling.All;

            // --- Error occurs here ---
            var result = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(ueaData), concreteType, jss);
            return (Message)result;
        }
    }

    public class Message
    {
        public int MessageID { get; set; }
        public Queue<Task> Tasks { get; set; } 
    }

    public class Task
    {
        public int TaskId { get; set; }
        public string Message { get; set; }
        public string Parameters { get; set; }
    }
}
4

2 に答える 2

2

バージョン 5 はあなたの問題を解決します。

于 2013-05-10T10:14:14.733 に答える
-1

私はJSON.NETシリアル化を使用する場合に固執しList<T>ます。ここで、TはJSONシリアル化可能な型です。Dictionary<string, T>これらは、JSON配列とオブジェクトタイプにうまく対応しています(json.orgを参照)。

をシリアル化List<T>してから逆シリアル化すると、JSON.NETはもちろん順序を維持します。を直接シリアル化するための動作を追加しようとするのではなく、シリアル化Queue<T>のためにとの間で変換することをお勧めします。List<T>Queue<T>

于 2012-12-16T06:00:30.520 に答える