我有一组使用 [Serialized]
属性的现有类。我需要在 WCF 服务中公开它们,因此我需要它们具有 [DataContract]
属性。它仅适用于 Serialized,但随后属性会得到有趣的名称,例如 ...k__BackingField。
这些类也在其他地方使用,我想知道替换属性是否会冒破坏任何东西的风险。另外,两者都有可能吗?
谢谢。
最佳答案
当您仅指定 DataContractAttribute 但没有具体指定要包含的成员属性时,默认行为是序列化类的所有字段,包括私有(private)字段。因此,我认为您获得的名称是因为您正在使用自动实现的属性。
换句话说,将类定义更改为类似于以下内容。请注意我想要序列化的属性上的 DataMember 属性。
[DataContract]
public class MyClass {
[DataMember]
public string SomeString {
get;
set;
}
[DataMember]
public int SomeInt {
get;
set;
}
public string DontSerializeThis {
get;
set;
}
}
这将导致 DataContractSerializer 序列化属性,而不是编译器生成的支持字段。但是,它确实要求属性是读/写公共(public)属性,因为它将通过这些属性访问器来获取和设置序列化数据。
另一个选项是将自动实现的属性更改为“正常”属性,这意味着添加您自己的支持字段。然后,您可以保留所有 DataMember 属性,这意味着它们都将被序列化,或者您可以将 DataMember 属性添加到您创建的新字段中,这样您就可以根据需要在序列化输出中重命名它们。
最后,关于在两个系统中使类可序列化是否是一个好主意,事实并非如此。如果您希望该类使用 BinaryFormatter 或 XmlSerializer 之类的东西参与经典序列化,那么您应该只针对该场景,因为 DataContractSerializer 已经可以序列化这些类。
如果您的目标是快速、高效的 .NET 3+ 到 .NET 3+(或 Silverlight)通信,DataContract 就是您的最佳选择。如果您的目标是互操作性和/或对 XML 表示的控制,请坚持使用 XML 序列化属性。
关于.net - 将 [Serializable] 更改为 [DataContract],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3286447/