首页 文章

使用Newtonsoft.Json使用Queue <T>反序列化类

提问于
浏览
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,Culture = neutral,PublicKeyToken = null]],System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' . 路径'任务 . $ type',第1行,第140位 .

我已经在下面包含了示例应用程序,我使用的是Newtonsoft.Json 4.5.10.15407 .

我使用Queue而不是List或Dictionary的原因是因为我必须保留插入顺序 . 我也试过在文档和其他问题中搜索,但没有真正发现任何具体的东西 . 任何帮助深表感谢 . 谢谢 .

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

2 回答

  • 2

    版本5解决了您的问题 .

  • -1

    在使用JSON.NET序列化时,我坚持 List<T>Dictionary<string, T> ,其中T是一些JSON可序列化类型 . 这些与JSON数组和对象类型很好地对应(参见json.org) .

    如果序列化 List<T> 然后反序列化它,JSON.NET当然会保持排序 . 我建议只需在 Queue<T>List<T> 之间进行序列化转换,而不是尝试添加直接序列化 Queue<T> 的行为 .

相关问题