【问题标题】:Deserializing a class with a Queue<T> with Newtonsoft.Json使用 Newtonsoft.Json 反序列化具有 Queue<T> 的类
【发布时间】:2012-12-14 19:05:45
【问题描述】:

我有一个具有队列类型属性的类。尝试反序列化 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'。路径“Tasks.$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; }
    }
}

【问题讨论】:

    标签: json c#-4.0 queue deserialization json.net


    【解决方案1】:

    第 5 版解决了您的问题。

    【讨论】:

      【解决方案2】:

      在使用 JSON.NET 序列化时,我坚持使用 List&lt;T&gt;Dictionary&lt;string, T&gt;,其中 T 是一些 JSON 可序列化类型。这些很好地对应于 JSON 数组和对象类型(请参阅json.org)。

      如果你序列化一个List&lt;T&gt; 然后反序列化它,JSON.NET 当然会保持顺序。我建议只在您的Queue&lt;T&gt;List&lt;T&gt; 之间进行转换以进行序列化,而不是尝试添加直接序列化Queue&lt;T&gt; 的行为。

      【讨论】:

        猜你喜欢
        • 2012-07-30
        • 2020-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        相关资源
        最近更新 更多