【问题标题】:Custom attribute to switch property serialization to NetDataContractSerializer将属性序列化切换到 NetDataContractSerializer 的自定义属性
【发布时间】:2010-12-25 20:32:41
【问题描述】:

在 .NET 3.5 中,我想创建一个自定义属性(例如 [NetDataMember]),它将序列化行为从 DataContractSerializer 切换到 NetDataContractSerializer

基本上,对于一个类A,如下图所示

[DataContract]
class A
{
  [DataMember]
  public int SimpleProperty { get; set; }

  [Transcient]
  public IBar ComplexProperty { get; set; }
}

我想获得一个默认行为类似于DataContractSerializer 的序列化程序,但对于标有[NetDataMember] 的属性,它将被NetDataContractSerializer 覆盖。

知道如何设计一个可以实现这种行为的序列化程序吗?

【问题讨论】:

    标签: .net serialization datacontractserializer netdatacontractserializer


    【解决方案1】:

    WCF 中没有“开箱即用”的方式来做到这一点 - 但很多非常聪明的人已经解决了这个问题。

    查看 Aaron Skonnard 的 blog post on the NetDataContractSerializer,他在其中提出了一种行为,您可以将其作为属性添加到数据合约中:

    [NetDataContractFormat] 
    

    在您的服务接口(所有方法)或单个方法上将使用 NetDataContractSerializer 进行该调用。您需要为每个操作或服务定义这个 - 而不是在您的数据合同上。

    【讨论】:

    • 感谢您的链接。实际上,我无法产生覆盖效果。我正在应用该属性,但在(反)序列化时永远不会调用覆盖行为。实例化 DCS 时是否遗漏了一些内容?
    • 反序列化时,在 WCF 中,不会调用任何构造函数 - 这是正常行为。
    • 但是要查看是否正在使用 NetDataContractSerializer,您应该查看发送的消息 - 使用 Visual Studio Common7/IDE 目录中的 WcfTestClient.exe,或者使用 Fiddler 之类的东西查看流量
    • @Rabskatran:感谢您的指出 - 是的,似乎博客文章不见了 - 似乎再也找不到了。查看 Aaron Skonnard 的 this MSDN article 以获得解释 - 但不幸的是,这不包括 [NetDataContractFormat] 属性代码,抱歉......
    • 博客文章的存档版本在这里:web.archive.org/web/20110814134219/http://…
    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2023-04-07
    相关资源
    最近更新 更多