我们目前正在使用 WCF 在客户端和服务器之间进行传输。我们正在使用带有 BinaryMessageEncoding 的 HttpTransportBinding。后端是 .NET,前端是 Xamarin(iOS、Android、Windows 10)和 Silverlight。我们正在寻找不同的转移选项。当然还有 REST 和 Web Sockets,但我的问题与序列化有关——而不是实际的协议。然而,我正在考虑减少传输带宽的所有选项。
最终目标是使用仅传输最少数据的二进制序列化,以使 DataContract 序列化正常工作。传输不需要人类可读,这就是我们不使用 Json 的原因。我愿意查看其他类型的序列化或其他可以完成这项工作的 DataContractSerializers,但我现在正在努力解决的是 WCF 通过网络发送的数据比实际需要的数据多得多。如果我查看 Fiddler 中的数据,我可以看到它正在发送 null 或空的 DataMember、完全不相关的 XML 命名空间等等。
在这里你可以看到我试图阻止 DataContractSerializer 在属性级别通过网络发送这些东西,但是 DataContractSerializer 忽略了我的请求:
[DataMember(IsRequired = false)]
bool IsPrimaryKeyOnly { get; set; }
[DataMember(IsRequired = false)]
ErrorDictionary ErrorDetails { get; set; }
[DataMember(IsRequired =false)]
bool IgnoreWarnings { get; set; }
[System.Runtime.Serialization.DataContractAttribute(IsReference = true, Namespace = "")]
[System.SerializableAttribute()]
public class AssetClass : Adapt.Model.RecordBase, Adapt.Model.IRecord
{
}
我能做些什么来让 DataContractSerializer 满足我的请求吗?是否有与 Xamarin 兼容的更高效的 DataContractSerializer?还有其他减少 WCF 冗长的技巧吗?我在声明属性的方式上做错了什么,还是我认为序列化程序应该足够聪明而不包含默认值是错误的?
令人沮丧的是,除了这个问题之外,当您知道服务的所有消费者都将基于 Microsoft 时,WCF 是一项非常好的技术。从表面上看,微软似乎不再费心改进 WCF 及其后续部分,例如 DataContractSerialization。我宁愿不批发更换技术。我宁愿解决冗长的问题。
请保存替代技术建议以供评论。