我有一组使用[Serializable]
属性的现有类。我需要在WCF服务中公开它们,因此我需要它们具有[DataContract]
属性。它只适用于Serializable,但属性变得有趣,如... k__BackingField。
这些类也在其他地方使用,我想知道我是否冒险通过替换属性来破坏任何东西。此外,它们是可能的,并且将两者都放在一起是个好主意吗?
感谢。
答案 0 :(得分:5)
当您只是指定DataContractAttribute但没有专门定义要包含的成员时,默认行为是序列化该类的所有字段,包括私有字段。所以你得到的名字是因为你使用自动实现的属性,我认为。
换句话说,将类定义更改为类似于以下内容。请注意我要序列化的属性上的DataMember属性。
[DataContract]
public class MyClass {
[DataMember]
public string SomeString {
get;
set;
}
[DataMember]
public int SomeInt {
get;
set;
}
public string DontSerializeThis {
get;
set;
}
}
这将导致DataContractSerializer序列化属性而不是其编译器生成的支持字段。但是,它确实要求属性是读/写公共属性,因为它将通过这些属性访问器来获取和设置序列化数据。
另一个选项是将自动实现的属性更改为“普通”属性,这意味着添加自己的支持字段。然后,您可以保留所有DataMember属性,这意味着它们都将被序列化,或者您可以将DataMember属性添加到您创建的新字段中,如果需要,可以在序列化输出中重命名它们。
最后,关于在两个系统中是否可以将类序列化是一个好主意,而不是真的。如果您希望类使用BinaryFormatter或XmlSerializer等参与经典序列化,那么您应该只针对该场景,因为DataContractSerializer已经可以序列化这些类。
如果您的目标是快速,高效,.NET 3+到.NET 3+(或Silverlight)通信,那么DataContract就是您的选择。如果您的目标是对XML表示的互操作性和/或控制,请坚持使用XML序列化属性。
答案 1 :(得分:0)
我认为此代码摘自Josh Einstein的回答:
public string DontSerializeThis {
get;
set;
}
由于相同答案中提到的默认行为,将导致后备字段被序列化的属性。它应该是
[IgnoreDataMember]
public string DontSerializeThis {
get;
set;
}
供参考,请参阅: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx