【问题标题】:Convert Queue<T> properties to List<T> on JSON serialization在 JSON 序列化上将 Queue<T> 属性转换为 List<T>
【发布时间】:2014-10-08 09:05:01
【问题描述】:

我正在使用 JSON.Net (here) 库进行一些(反/)序列化。但是我正在使用的 JSON.Net 版本(认为它已修改为与 Unity3D 一起使用 - 在手机上)无法序列化队列,但可以毫无问题地序列化列表。

所以下面的类可以正确序列化(字符串将包含列表项):

public class SomeClassList
{
 List<SomeOtherClass> m_Stuff = new List<SomeOtherClass>();
 public List<SomeOtherClass> Stuff
 {
  get{return m_Stuff;}
 }
}

但这不会:

public class SomeClassQueue
{
 Queue<SomeOtherClass> m_Stuff = new Queue<SomeOtherClass>();
 public Queue<SomeOtherClass> Stuff
 {
  get{return m_Stuff;}
 }
}

例子:

.
.
.
SomeClassList someClassList = new SomeClassList()
SomeClassQueue someClassQueue = new SomeClassQueue()

这样做:

JsonConvert.SerializeObject(someClassList)

将返回:{"Stuff":[SomeOtherClass, SomeOtherClass, SomeOtherClass]} (其中“SomeOtherClass”实际上是字段,它是 SomeOtherClass 的数据

这样做:

JsonConvert.SerializeObject(SomeClassQueue)

将返回:

 {"Stuff":[]}

因为它无法读取队列实体。

我想知道如何使用 IContractResolver 或从 DefaultContractResolver 继承以在序列化时从队列转换为列表(以便可以正确读取)并在反序列化时将其转回队列。

【问题讨论】:

  • @Daniel A. White:感谢您的编辑,但是当不指定使用哪个库时,这个问题是不是太“笼统”了?
  • 你加的标签就够了;无需在标题中添加。
  • 标签在标签字段中更好。它使标题保持简洁和有趣。
  • 好的,很抱歉!
  • 也许你可以向我们展示你到目前为止所做的尝试

标签: c# json serialization unity3d json.net


【解决方案1】:

here 发布了一个类似的 stackoverflow 问题。

既然Queue实现了IEnumerable,你应该可以使用:

List<T> list = new List<T>(queue);

#likewise
Queue queue = new Queue<T>(list); 

反之亦然

否则你也可以使用
queue.ToList()

【讨论】:

  • 我猜他不想仅仅因为序列化程序无法处理它而改变他的代码/表示(一个非常合理的想法)
  • 正如 Carsten 所说,我不想仅仅因为我无法序列化属性而改变我的班级。我想使用 ContractResolver 来做你建议的事情。 :(
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2021-11-26
相关资源
最近更新 更多