Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于数组的Newtonsoft StringEnumConverter返回未知数字_C#_Serialization_Json.net - Fatal编程技术网

C# 用于数组的Newtonsoft StringEnumConverter返回未知数字

C# 用于数组的Newtonsoft StringEnumConverter返回未知数字,c#,serialization,json.net,C#,Serialization,Json.net,将Newtonsoft Json.Net(11.0.2)与StringEnumConverter结合使用似乎在大多数情况下都能正常工作,但有时我们会得到一个Json数组,其中的数字与数组不对应。有人知道这是怎么发生的吗 我曾尝试设置测试来模拟奇怪的输出,但每次都能如期工作。我在想,可能是内存问题导致了奇怪的行为,因为我们只在生产中偶尔看到这种情况 因此,我们使用StringEnumConverter配置序列化程序设置,并使用以下枚举作为示例: public enum TestType

将Newtonsoft Json.Net(11.0.2)与StringEnumConverter结合使用似乎在大多数情况下都能正常工作,但有时我们会得到一个Json数组,其中的数字与数组不对应。有人知道这是怎么发生的吗

我曾尝试设置测试来模拟奇怪的输出,但每次都能如期工作。我在想,可能是内存问题导致了奇怪的行为,因为我们只在生产中偶尔看到这种情况

因此,我们使用StringEnumConverter配置序列化程序设置,并使用以下枚举作为示例:

    public enum TestType
    {
        FirstOption,
        SecondOption,
        ThirdOption
    }

var example = new List<TestType>() { TestType.FirstOption, TestType.SecondOption };
这是我们大部分时间得到的输出,然而,在生产中我们得到的

[13]
枚举中没有13项,那么它如何生成13项呢? 是否有一些二进制编码?

枚举在.NET中,因此没有任何东西可以阻止您使用任意顺序值填充它。问题不在JSON.NET中,而是在某个地方填充要序列化的数据

下面是一个简单的测试用例:

[JsonConverter(typeof(StringEnumConverter))]
public enum TestType
{
    FirstOption,
    SecondOption,
    ThirdOption
}

public const TestType Unlucky13 = (TestType)13;

public static void Main()
{
    var testCase = new[] { TestType.FirstOption, TestType.SecondOption };
    Console.WriteLine(JsonConvert.SerializeObject(testCase));
    testCase[0] = Unlucky13;
    Console.WriteLine(JsonConvert.SerializeObject(testCase));
}
输出为:

["FirstOption","SecondOption"]
[13,"SecondOption"]

可能,我的水晶球说真正的枚举类型具有[Flags]属性。请尝试设置
StringEnumConverter.AllowIntegerValues=false
,如中所示。@HansPassant我们没有显式设置[Flags]不过,我会研究一下,看看我们是否能破解13means@dbc不幸的是,我们不能再将该选项设置为false,因为如果我们这样做,生产系统中的数据将不会反序列化。感谢链接该文章。我现在添加了一些验证,试图防止这种情况再次发生。尽管我们仍然无法找到这种奇怪行为的根源。我们从不通过类型转换进行任何设置
["FirstOption","SecondOption"]
[13,"SecondOption"]