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; }
}
}