Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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 Json序列化条件序列化意外启动_C#_Json_Serialization_Json.net - Fatal编程技术网

C# Newtonsoft Json序列化条件序列化意外启动

C# Newtonsoft Json序列化条件序列化意外启动,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我遇到了一个奇怪的问题,Newtonsoft Json条件序列化意外出现。我将其归纳为一个简单的示例(我们使用的是newtonsoft json 5.0.8): 以上各项的输出: Test 1: {"FooSpecified":false} Test 2: {"Foo":"bar","FooSpecified":true} 似乎将名为“xsspecified”的bool属性(其中“x”与另一个属性的名称匹配)作为条件序列化。我在Newtonsoft json条件序列化文档()中找不到这方面的文

我遇到了一个奇怪的问题,Newtonsoft Json条件序列化意外出现。我将其归纳为一个简单的示例(我们使用的是newtonsoft json 5.0.8):

以上各项的输出:

Test 1: {"FooSpecified":false}
Test 2: {"Foo":"bar","FooSpecified":true}
似乎将名为“xsspecified”的bool属性(其中“x”与另一个属性的名称匹配)作为条件序列化。我在Newtonsoft json条件序列化文档()中找不到这方面的文档记录,也没有任何谷歌搜索显示这种行为的其他结果


有人知道这是预期行为还是我遇到了某种错误吗?

我不相信这是错误。要么你找不到合适的文档,要么它没有文档,但我不会把它称为bug。为了再次检查行为,我使用以下代码生成了类似的结果

TestClass test1 = new TestClass("foo", false);
string serial1 = JsonConvert.SerializeObject(test1);
test1.FooSpecified = true;
string serial3 = JsonConvert.SerializeObject(test1);
Console.WriteLine("Test 1: {0}", serial1);
Console.WriteLine("Test 1: {0}", serial3);
经过一点研究,我发现这可能是为了实现与
XmlSerializer
的对等,后者使用
propertyNameSpecified
模式实现相同的目的。这是我从JNK找到的关于它的最后一条评论,然而,他一定改变了主意,因为很明显,它已经实现了

编辑:添加LB评论中的源链接,该链接清楚地表明它是有意实现的


另外,如果你阅读了codeplex链接上的完整评论,你会发现完整的故事。JNK说他不会实现它,但如果其他人实现了,他会添加它。最后的评论是有人说他们已经做到了。我认为JNK在这方面做得很好。

这看起来很有意义:我不认为这是一个错误,谢谢Evan;那就不是虫子了。我确实从JNK的评论中得到了笑声:“我认为属性的名称比ShouldSerialize命名模式更可能意外地绊倒某人”,这正是有人在我们的代码库中添加新成员并破坏序列化时发生的情况。:)
TestClass test1 = new TestClass("foo", false);
string serial1 = JsonConvert.SerializeObject(test1);
test1.FooSpecified = true;
string serial3 = JsonConvert.SerializeObject(test1);
Console.WriteLine("Test 1: {0}", serial1);
Console.WriteLine("Test 1: {0}", serial3);