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