何时/为啥不应该在我的 DataContracts 上使用 IsReference=true?

Posted

技术标签:

【中文标题】何时/为啥不应该在我的 DataContracts 上使用 IsReference=true?【英文标题】:When/Why should I not use IsReference=true on my DataContracts?何时/为什么不应该在我的 DataContracts 上使用 IsReference=true? 【发布时间】:2012-02-11 04:50:07 【问题描述】:

我了解什么是属性属性 IsReference 以及它在做什么。但我不明白为什么/何时应该使用它。什么时候使用 IsReference=true 是个坏主意?

如果我的 wcf 服务是 .net 到 .net,是否有充分的理由设置 IsReference=true?

【问题讨论】:

【参考方案1】:

避免使用 IsReference 至少有两个原因:

首先存在性能损失,因为所有序列化程序都必须对每个要序列化的对象执行身份检查。

其次,DataContractJsonSerializer 无法序列化标有 IsReference 属性的对象。因此,如果您需要同时支持 Xml 和 Json,那么您将无法使用它。

除此之外,我看不出有任何理由不使用它。毕竟它确实节省了一些宝贵的带宽!

【讨论】:

虽然 JSON.Net 可以处理 IsReference=true。 dotnet.learningtree.com/2012/04/03/…【参考方案2】:

我认为不应该发生任何不好的事情。如果您的图形包含多个指向同一对象实例的链接,则将此属性设置为 true 将减小 XML 大小。

http://zamd.net/2008/05/20/datacontract-serializer-and-isreference-property/

但我不确定为什么默认情况下不启用它。

【讨论】:

以上是关于何时/为啥不应该在我的 DataContracts 上使用 IsReference=true?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 .Net 4.0 构建客户端 DataContracts 会导致 .Net 4.5 应用程序中的 MethodAccessException?

WCF DataContracts 和基础数据结构

为啥我们需要复制构造函数以及何时应该在 java 中使用复制构造函数

FCM 令牌 - 我应该何时将其存储/保存在我的数据库中?

为啥存在 Google maven 存储库以及我应该何时使用它?

为啥以及何时应该在块的末尾使用逗号?