C# 使用Newtonsoft.Json序列化和反序列化后,堆栈元素的顺序颠倒
当序列化/反序列化时,堆栈中元素的顺序颠倒,我遇到了一个问题。有关复制,请参阅此演示:C# 使用Newtonsoft.Json序列化和反序列化后,堆栈元素的顺序颠倒,c#,json.net,C#,Json.net,当序列化/反序列化时,堆栈中元素的顺序颠倒,我遇到了一个问题。有关复制,请参阅此演示: using System; using System.Collections.Generic; using Newtonsoft.Json; namespace StackChecker { class Program { enum Screen { Unknown, Bypass, Claim
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace StackChecker
{
class Program
{
enum Screen
{
Unknown,
Bypass,
ClaimDetails,
ClaimSearch,
ClaimSearchResults,
PatientSearchResults
}
static void Main(string[] args)
{
var screens = new Stack<Screen>();
screens.Push(Screen.Unknown);
screens.Push(Screen.Bypass);
screens.Push(Screen.ClaimDetails);
screens.Push(Screen.ClaimSearch);
screens.Push(Screen.ClaimSearchResults);
screens.Push(Screen.PatientSearchResults);
foreach (var screen in screens)
{
Console.WriteLine("Screen {0}: {1}", (int)screen, screen);
}
var screenJson = JsonConvert.SerializeObject(screens);
Console.WriteLine("Screens Json: \"{0}\"", screenJson);
var screens2 = JsonConvert.DeserializeObject<Stack<Screen>>(screenJson);
foreach (var screen in screens2)
{
Console.WriteLine("Screen {0}: {1}", (int)screen, screen);
}
var screenJson2 = JsonConvert.SerializeObject(screens2);
Console.WriteLine("Screens Json: \"{0}\"", screenJson2);
Console.ReadLine();
}
}
}
所以,问题是——为什么顺序颠倒了?(我也用数组尝试过这一点,可以证明数组元素是不可逆的)
这可以避免吗?如果没有,有人想到了一个优雅的解决方案吗 您可以反序列化到
列表
中,比如var screens2=JsonConvert.DeserializeObject(screenJson)
。如果您需要一个堆栈作为数据结构,那么您可以创建一个临时列表,将其反转并复制到堆栈中
var screensTemp = JsonConvert.DeserializeObject<List<Screen>>(screenJson);
screensTemp.Reverse();
var screens2 = new Stack<Screen>(screensTemp);
foreach (var screen in screens2)
{
Console.WriteLine("Screen {0}: {1}", (int)screen, screen);
}
var screensTemp=JsonConvert.DeserializeObject(screensjson);
screensTemp.Reverse();
var screens2=新堆栈(screensTemp);
foreach(屏幕2中的var屏幕)
{
WriteLine(“屏幕{0}:{1}”,(int)屏幕,屏幕);
}
序列化不是这里的问题。如果您编写以下代码vars1=newstack(new[]{0,1,2,3,4});var s2=新堆栈(s1)代码>,您将看到相同的问题,它源于堆栈
构造函数在提供IEnumerable
参数时是如何编写的。修理反序列化为列表并在构造堆栈之前反转?堆栈的默认枚举器
按项目从堆栈中弹出的顺序枚举项目。如果您按该顺序将项目推到另一个堆栈上,则另一个堆栈将按相反顺序包含项目。对于重复的问题,我深表歉意-我在发布之前搜索过此问题。谢谢大家的帮助:)
var screensTemp = JsonConvert.DeserializeObject<List<Screen>>(screenJson);
screensTemp.Reverse();
var screens2 = new Stack<Screen>(screensTemp);
foreach (var screen in screens2)
{
Console.WriteLine("Screen {0}: {1}", (int)screen, screen);
}