将[Serializable]更改为[DataContract]

Xav*_*nas 2 .net wcf serialization

我有一组使用该[Serializable]属性的现有类.我需要在WCF服务中公开它们,因此我需要它们具有该[DataContract]属性.它只适用于Serializable,但属性变得有趣,如... k__BackingField.

这些类也在其他地方使用,我想知道我是否冒险通过替换属性来破坏任何东西.此外,它们是可能的并且两者兼顾是一个好主意吗?

谢谢.

Jos*_*osh 5

当您只指定DataContractAttribute但没有专门定义要包含的成员时,默认行为是序列化类的所有字段,包括私有字段.所以你得到的名字是因为你正在使用自动实现的属性,我想.

换句话说,将类定义更改为类似于以下内容.请注意我要序列化的属性上的DataMember属性.

[DataContract]
public class MyClass {

    [DataMember]
    public string SomeString {
        get;
        set;
    }

    [DataMember]
    public int SomeInt {
        get;
        set;
    }

    public string DontSerializeThis {
        get;
        set;
    }

}
Run Code Online (Sandbox Code Playgroud)

这将导致DataContractSerializer序列化属性,而不是编译器生成的后备字段.但是,它确实要求属性是读/写公共属性,因为它将通过这些属性访问器来获取和设置序列化数据.

另一种选择是将自动实现的属性更改为"普通"属性,这意味着添加自己的支持字段.然后,您可以保留所有DataMember属性,这意味着它们都将被序列化,或者您可以将DataMember属性添加到您创建的新字段中,这样您就可以根据需要在序列化输出中重命名它们.

最后,关于在两个系统中是否可以将类序列化是一个好主意,而不是真的.如果您希望类使用BinaryFormatter或XmlSerializer等参与经典序列化,那么您应该只针对该场景,因为DataContractSerializer已经可以序列化这些类.

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