使用SerializableAttribute的DataContractSerializer意外行为

时间:2013-09-30 11:39:39

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

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

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

我做了大量的研究并发现according to MSDN,与普遍看法相反,属性[DataContract]是可选的,如果没有在类上指定属性,则所有公共读/写属性和字段是序列化的。事实上,当我将其序列化时 - 它按预期工作。

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

我的问题:

  1. 任何人都可以解释为什么 DataContractSerializer在有和没有[Serializable]属性的情况下会有不同的行为?不是技术解释(这可能类似于“在这种情况下XmlObjectSerializer的基类正在接管”),但设计原因。我无法看到这种不同的序列化如何以任何方式有用。如果有的话 - 它会破坏向后兼容性。建议改变微软是否有意义?
  2. 如果我不想查看我们整个巨大的数据模型并使用[DataContract]和[DataMember]装饰所有内容 - 是否有一种更通用的方式来告诉DataContractSerializer或WCF基础结构(通过服务契约属性)或者这样),还要在其默认(读取:未修饰)行为中序列化标记为[Serializable]的类?不幸的是,属性[XmlSerializerFormat]对我来说不是一个选项,我需要坚持使用DataContractSerializer for WCF。

1 个答案:

答案 0 :(得分:-1)

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

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

更好的解决方法是使用[DataContract]。这使您可以精确控制通过线路发送的数据。在我看来,通过服务发送大量数据模型比代码更具代码味道。我会尝试在可能的情况下将这些重构为较小的类。