当前位置: 首页 > 编程语言 > C#

动态忽略数据成员是序列化的Share

时间:2023-04-10 16:28:06 C#

动态忽略数据成员是序列化的我们有一个现有的WCF服务,它使用了多个DataContracts。我们想根据设备修改序列化,以便从移动设备访问时,服务应该只序列化一些重要的数据成员(不是全部)我们在这里有两个选项为不同类型的设备创建单独的操作和数据契约实际的xml序列化混淆并抑制了基于设备的不必要元素的创建我们不想使用第一个选项,因为它在未来引入了很多冗余代码问题小型研究表明我们需要使用IXmlSerializable并覆盖readXML()和writeXML()方法。但与此同时,我看到了DataContract和IXmlSerializable不应一起使用的地方。非常感谢任何混淆实际序列化的示例。[DataContract]公共类TokenMessage{stringtokenValue;字符串额外值;[DataMember]publicstringToken{get{returntokenValue;}设置{tokenValue=值;}}[DataMember]publicstringExtra{get{returnextraValue;}设置{extraValue=值;现在,当我从返回典型TokenMessage数据合同的移动设备访问服务时,我不希望序列化“额外”数据成员,即当我向操作合同提供不同的参数时,它应该可以序列化优化部分/所有数据成员(取决于操作)PS:请暂时忽略设备检测部分。假设我们在操作合同中有一个参数可以帮助我们识别设备我不相信@PranavSingh的答案的某些变化不是更好的设计,但这不是你的问题......正如你评论的那样如.NET中所述,属性是静态的。这意味着动态添加/删除[DataMember]不是一个好的选择。可能的。有一些选项,例如使用Reflection.Emit在元数据更改时重新创建实例(请参阅CanpropertiesbedynamicallyaddedinC#?的所有答案),但所有这些路径都很复杂。我看到两个合理的选择:1)为服务实施IParameterInspector。在AfterCall()方法中,您可以在序列化之前检查和更改返回给客户端的参数。有一些工作是使用反射来动态确定参数类型并设置它们的值,但并不复杂。这是一个更好的设计,可以在许多合同或服务中重用行为。CarlosFigueira的博客是WCF扩展示例的最佳来源。2)使用[OnSerializing]和[OnSerialized]事件。在[DataContract]中,您可以临时更改序列化期间返回的属性。事件实际上是为了启用初始化而设计的,所以这个解决方案有点hack。该解决方案也不是线程安全的。但它确实将代码保存到DataContract类中并快速解决了问题(我认为你正在寻找快速)。解决方案#2可能如下所示:[DataContract]publicclassTokenMessage{stringtokenValue;字符串额外值;boolenableExtraValue=true;[DataMember]publicstringExtra{get{if(enableExtraValue)returnextraValue;返回空值;}设置{extraValue=值;}}[OnSerializing()]internalvoidOnSerializingMethod(StreamingContextcontext){enableExtraValue=false;}[OnSerialized()]internalvoidOnSerializedMethod(StreamingContextcontext){enableExtraValue=true;解决方案#2是一个快速修复方案(我想你正在寻找)。解决方案#1是更好的设计。有一种方法,但我认为它需要生成一个额外的DataContract,但仍然不需要针对不同类型的设备进行单独的操作和数据契约。它可以经典地实现运行时多态性。我只是在想:假设你有一个通用的DataContract:[DataContract][KnownType(typeof(Extra))][KnownType(typeof(Extra2))]publicclassTokenMessage{stringtokenValue;字符串额外值;[DataMember]publicstringToken{get{returntokenValue;}设置{tokenValue=值;}}}其他设备特定的合约可以继承TokenMessage作为基类,例如:[DataContract]publicclassExtra:TokenMessage{[DataMember]publicstringExtra{get;放;}}[DataContract]publicclassExtra2:TokenMessage{[DataMember]publicstringExtra2{get;set;现在在运行时,你说你知道操作合同中的一个参数可以帮助我们识别设备。假设基于设备类型,您可以使用派生类实例化基类,例如:TokenMessagetm=newExtra();或TokenMessagetm=newExtra2();因此,在运行时,您将决定哪个设备合同将成为通用响应的一部分。注意:添加KnownType将在wsdl中为基类中的所有已知类型生成单独的xsd,但会在运行时保存数据的序列化,因为这应取决于所选择的实际继承。尝试使用IgnoreDataMemberAttribute在您的模型中添加属性“ShouldSerializeYOUR_PROPERTY_NAME”,当您不希望属性被序列化时将其设置为false。详细看这里:http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.shouldserializeproperty(v=vs.110).aspx以上是C#学习教程:Dynamicallyignoredatamembersbeingserialized如果对你有用,需要进一步了解C#学习教程,希望大家多多关注分享的全部内容。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: