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

标签 .net wcf serialization

我有一组使用 [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/

相关文章:

wcf - 使用 jQuery/Ajax 从 JavaScript 调用 WCF/JSON/REST WebService

c# - (uint) index >= (uint)_size 比 index >= _size 更好吗?

.net - 为什么 MSMQ 比 WCF QueueService 快?

c# - 拆分数据表

java - 如何反序列化对象?

java - gson排除策略仅适用于目标对象的字段

Python 3.4.3 json.dumps() "is not JSON serializable"从字节转换时出错

.net - 模拟和验证对包含 Expression<Func<T,bool>> 参数的方法的调用

WCF InstanceContextMode.Multiple 问题

c# - 已处理死信队列中的 MSMQ 无效签名错误