WCF - 不要序列化(发出)空集合

时间:2014-02-06 12:28:21

标签: c# wcf serialization collections

我们正在实施一个客户端/服务器应用程序。数据在整个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;
}

有没有优雅的方法呢?

或者甚至是一种完全不同的方法?

备注:为简单起见,我并不关心可能的多线程问题。

1 个答案:

答案 0 :(得分:1)

  

但如上所述,数据可能会从一个站点发送到另一个站点。   因此:尺寸真的很重要!

你真的认为在局域网中使用NetTcpBinding会有几个字节会产生很大的影响吗?你做过负载测试来证明这一点。

  

我知道不推荐[DataMember(EmitDefaultValue = false)]   由微软

这不是推荐因为它不可互操作。由于NetTcpBinding上只有WCF客户端/服务器,因此重新发送不适用于您的情况。配置已经不支持互操作(通过java或php)。

WCF二进制编码器(在NetTcpBinding中使用)支持自.net 4.5以来的Gzip / Deflate压缩。使用此功能将获得比删除空集合更多的字节。 阅读更多here