我有一个类具有Queue类型的属性。尝试反序列化JSON时,出现以下错误:
在JSON中指定的类型'ConsoleApplication1.Task [],ConsoleApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'与不兼容''系统.Collections.Generic.Queue`1 [[ConsoleApplication1.Task,ConsoleApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'。路径'任务。$ type',第1行,第140位。
我在下面提供了示例应用程序,我使用的是Newtonsoft.Json 4.5.10.15407。
我使用队列而不是列表或词典的原因是因为我必须保留插入顺序。我也试过在文档和其他问题中搜索,但没有真正发现任何具体的东西。任何帮助深表感谢。谢谢。
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; }
}
}
答案 0 :(得分:2)
第5版解决了您的问题。
答案 1 :(得分:-1)
在使用JSON.NET序列化时,我坚持使用List<T>
和Dictionary<string, T>
,其中T是一些JSON可序列化类型。这些与JSON数组和对象类型很好地对应(参见json.org)。
如果您序列化List<T>
然后反序列化它,JSON.NET当然会保持排序。我建议您只需在Queue<T>
和List<T>
之间进行序列化翻译,而不是尝试添加直接序列化Queue<T>
的行为。