我们正在实施一个客户端/服务器应用程序。数据在整个LAN中发送。 LAN是指具有多个站点/位置的公司网络。
我们正在使用WCF和NetTcpBinding(编辑:VS2010 .net 4.0)。
我知道Microsoft不推荐[DataMember(EmitDefaultValue = false)]
。但如上所述,数据可能会从一个站点发送到另一个站点。因此:大小真的很重要!
不发送默认值大部分时间都可以正常工作。我对任何类型的集合都有一个问题。我不想转移空集合!
所以我通常最终会遇到相同类型的成员(一个用于工作,一个工作网络),我需要实现OnSerializing和OnDeserialized方法。
[DataMember(EmitDefaultValue = false)]
private List<someType> data = new List<someType>();
[NonSerialized]
private List<someType> network = new List<someType>();
[OnDeserialized]
private void OnDeserialized(StreamingContext c)
{
if (network == null)
data = new List<someType>();
else
data = network;
}
[OnSerializing]
private void OnSerializing(StreamingContext c)
{
if (data.Count > 0)
network = data;
else
network = null;
}
有没有优雅的方法呢?
或者甚至是一种完全不同的方法?
备注:为简单起见,我并不关心可能的多线程问题。
答案 0 :(得分:1)
但如上所述,数据可能会从一个站点发送到另一个站点。 因此:尺寸真的很重要!
你真的认为在局域网中使用NetTcpBinding会有几个字节会产生很大的影响吗?你做过负载测试来证明这一点。
我知道不推荐[DataMember(EmitDefaultValue = false)] 由微软
这不是推荐因为它不可互操作。由于NetTcpBinding上只有WCF客户端/服务器,因此重新发送不适用于您的情况。配置已经不支持互操作(通过java或php)。
WCF二进制编码器(在NetTcpBinding中使用)支持自.net 4.5以来的Gzip / Deflate压缩。使用此功能将获得比删除空集合更多的字节。 阅读更多here。