【问题标题】:DataContractSerializer unexpected behavior consuming SerializableAttributeDataContractSerializer 使用 SerializableAttribute 的意外行为
【发布时间】:2013-10-06 06:15:56
【问题描述】:

我正在尝试使用DataContractSerializer 来序列化一个简单的对象:

public class MyType {
  public string MyValue { get; set; }
}

我进行了广泛的研究,发现according to MSDN,与流行的看法相反,属性[DataContract]是可选的,如果没有在类上指定属性,那么所有公共读/写属性和字段都会被序列化。事实上,当我这样序列化它时 - 它按预期工作。

现在,如果我还在类上添加 [Serializable] 属性,我会得到一个不同的序列化,其中包含臭名昭著的前缀“k__BackingField”(因为我的属性是自动属性)。

我的问题:

  1. 谁能解释为什么DataContractSerializer 在有和没有[Serializable] 属性的情况下会有不同的行为?不是技术解释(可能类似于“在这种情况下 XmlObjectSerializer 的基类正在接管”),而是设计原因。我看不出这种不同的序列化有何用处。如果有的话 - 它会破坏向后兼容性。建议对 Microsoft 进行更改是否有意义?
  2. 如果我不想检查整个庞大的数据模型并使用 [DataContract] 和 [DataMember] 装饰所有内容 - 是否有更通用的方法来告诉 DataContractSerializer 或 WCF 基础架构(通过服务合同属性或类似的),以序列化在其默认(读取:未修饰)行为中标记为 [Serializable] 的类?不幸的是,属性 [XmlSerializerFormat] 不适合我,我需要坚持使用 WCF 的 DataContractSerializer。

【问题讨论】:

    标签: c# serialization .net-4.5 datacontractserializer serializableattribute


    【解决方案1】:

    对于您的第一个问题:[Serializable] 属性适用于 .NET Remoting 传输,该传输带有其旧版兼容性序列化。因此,不鼓励在使用 WCF 时应用此属性。你可以阅读更多关于这个here的信息。

    您的第二个问题,如果没有更多细节,就不容易回答。一个简单的解决方法是将[System.Xml.Serialization.XmlRoot()] 属性应用于您的数据模型类。虽然此属性不适用于 Web 服务,但它确实提供了同样忽略私有属性的干净 SOAP 消息。互操作性可能是一个问题,我还没有测试过。

    更好的解决方法是使用[DataContract]。这使您可以更好地控制通过网络发送的数据。在我看来,通过服务发送大量数据模型是一种代码味道。我会尽量将它们重构为更小的类。

    【讨论】:

    • -1 恐怕这 (A) 不能回答我的任何一个问题,(B) 说明了我特别要求避免的解决方案,并且 (C) 有一些不正确的陈述。 #1:[Serializable] 不仅适用于 .NET Remoting,而且对于我的 DM 需要的任何二进制序列化都是必需的,因为它是通过 .NET 会话机制进行序列化的。 #2:XmlRoot 对 DataContractSerializer 没有影响,仅对 XmlSerializer 有影响,正如我提到的,我必须坚持前者。
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多