.net 将[Serializable]更改为[DataContract]

.net 将[Serializable]更改为[DataContract],.net,wcf,serialization,.net,Wcf,Serialization,我有一组使用[Serializable]属性的现有类。我需要在WCF服务中公开它们,因此我需要它们具有[DataContract]属性。它只适用于可序列化,但属性会得到有趣的名称,如…k_ubackingfield 这些类也在其他地方使用,我想知道替换属性是否会有破坏任何东西的风险。而且,这是可能的,而且两者兼有是一个好主意吗 谢谢。当您只指定一个DataContractAttribute,而不指定要包含的成员的特定属性时,默认行为是序列化类的所有字段,包括私有字段。因此,我假设您得到的名称是因

我有一组使用
[Serializable]
属性的现有类。我需要在WCF服务中公开它们,因此我需要它们具有
[DataContract]
属性。它只适用于可序列化,但属性会得到有趣的名称,如…k_ubackingfield

这些类也在其他地方使用,我想知道替换属性是否会有破坏任何东西的风险。而且,这是可能的,而且两者兼有是一个好主意吗


谢谢。

当您只指定一个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已经可以序列化这些类了


如果您的目标是快速、高效的.NET3+到.NET3+(或Silverlight)通信,那么DataContract就是一个不错的选择。如果您的目标是互操作性和/或控制XML表示,请坚持使用XML序列化属性。

我认为这段代码摘自Josh Einstein的答案:

public string DontSerializeThis {
    get;
    set;
}
由于同一答案中提到的默认行为,将导致对支持字段进行序列化的属性。应该是

[IgnoreDataMember]
public string DontSerializeThis {
    get;
    set;
}
有关参考,请参阅:

谢谢-我必须与可能使用XmlSerializer的现有代码保持兼容,因此我想我唯一的选择是扩展自动属性。如果我同时使用这两个属性,您能详细说明可能出现的问题吗?我希望XmlSerializer忽略DataContract属性,反之亦然?据我所知,这些属性不应该冲突。但是这两个序列化程序在序列化引用、默认值、支持的类型、空格保留等方面的行为非常不同,额外的属性可能会破坏类。但是从技术上讲,我不希望有任何冲突。@Josh Einstein-一个标有[DataContract]的C#类,它有一个复杂的类型,即自定义对象,它的类定义有一个[Serializable]属性,会有什么后果?