将[Serializable]更改为[DataContract]

时间:2010-07-20 01:54:39

标签: .net wcf serialization

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

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

感谢。

2 个答案:

答案 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