Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 当我将字典序列化为[JsonArray]时,JSON.NET为我提供了重复的$id值,而不是使用引用_C#_.net_Json_Serialization_Json.net - Fatal编程技术网

C# 当我将字典序列化为[JsonArray]时,JSON.NET为我提供了重复的$id值,而不是使用引用

C# 当我将字典序列化为[JsonArray]时,JSON.NET为我提供了重复的$id值,而不是使用引用,c#,.net,json,serialization,json.net,C#,.net,Json,Serialization,Json.net,我有一个字典属性,我想用一个引用类型作为它的键进行序列化。由于JSON.NET只支持原语类型作为键,所以我将字典类型设置为[JsonArray]。但是,现在,当我的所有字典键被多次引用时,它们都会被复制,从而导致反序列化错误,表示存在重复的$id值。在这种情况下,我如何让JSON.NET像在所有其他情况下一样实际创建引用,而不是每次对象出现时都复制它们?这可能与KeyValuePair是一种值类型有关吗?您添加了吗 PreserveReferencesHandling = PreserveRef

我有一个字典属性,我想用一个引用类型作为它的键进行序列化。由于JSON.NET只支持原语类型作为键,所以我将字典类型设置为[JsonArray]。但是,现在,当我的所有字典键被多次引用时,它们都会被复制,从而导致反序列化错误,表示存在重复的$id值。在这种情况下,我如何让JSON.NET像在所有其他情况下一样实际创建引用,而不是每次对象出现时都复制它们?这可能与KeyValuePair是一种值类型有关吗?

您添加了吗

PreserveReferencesHandling = PreserveReferencesHandling.Objects
到您的
JsonSerializerSettings
?有关更多信息,请参阅


另外,请注意,实现ISerializable的类型不能与保留的对象引用一起正常工作;如果引用键类型实现了ISerializable,则需要执行其他操作,例如添加属性或添加
JsonConverter
,以控制其序列化。

注意:这将完全删除$id属性

对我和许多其他人来说,
preserverencesshandling
设置不起作用

但这个答案确实有效:

在DefaultContractResolver/IContractResolver的实现中,添加以下内容:

public override JsonContract ResolveContract(Type type) {
    var contract = base.ResolveContract(type);
    contract.IsReference = false;
    return contract;
}

为此,我向JSON.NET提交了一份错误报告,得到的答案是使用ObjectCreationHandling.Replace。

我将PreserveReferencesHandling设置为All。我尝试序列化的类中没有一个实现ISerializable,尽管其中一些具有[Serializable]属性。此外,我的关键对象的子对象被正确引用;只是键本身被复制了。我尝试将PreserveReferencesHandling从All更改为object,但没有帮助。@ekolis是否在父对象的构造函数中预填充了字典?JSON.Net调用默认构造函数,不会从列表中清除预先存在的项,这可能会引入明显的重复项。不,我认为您可能误解了。我并不是说当我反序列化数据时,我会得到重复的对象。我是说,当我反序列化数据时,JSON.NET抛出一个异常,因为序列化数据中有重复的$id值。(嗯,我想知道为什么当我试图在这里@your username时,它会在我保存评论时消失?@ekolis,如果它是对我的回答的答复,那么@me是如此多余。无论如何,我认为您在JSON.NET中遇到了一个“盲点”;它实际上更类似于
XmlSerializer
,而不是
BinaryFormatter
,而且它对引用别名的支持非常不完整,如果您做一些稍微有趣的事情,它往往会中断。这对我来说没有意义。我不想摆脱ID和整个参考系统;我想保留引用,所以我(理论上)不会得到重复的对象,但在实践中也不会得到重复的对象!我懂了。我想我误解了你的问题,对不起!默认情况下,Newtonsoft将返回$id从1开始的对象。因此,您可能会询问数据2次,可能是不同类型的请求,但对于每个请求,newtonsoft会从1开始生成新的id。所以你应该使用容器