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

标签 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;
}

有什么优雅的方法可以做到这一点吗?

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

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

最佳答案

But as mentionend above, data might be sent from one site to another. Therfore: size really matters!

您真的认为在 LAN 中使用 NetTcpBinding 时几个字节会有很大的不同吗?您是否进行了负载测试以证明这一点。

I know that [DataMember(EmitDefaultValue = false)] is not recommended by Microsoft

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

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

关于c# - WCF - 不要序列化(发出)空集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21603006/

相关文章:

Django REST框架: create JSON fragments from string

java - Java-API 的实际 JSON 序列化基准

c# - 在 C# 中计算多语言字符串长度以存储在 Oracle VARCHAR2 字段中

c# - 从字节(具有任意编码的文本)在内存中创建 zip 文件

wcf - WCF 数据契约中是否可以包含 WCF 操作契约?为什么?

c# - 如何在发出请求之前将 WCF Http 客户端绑定(bind)到特定的出站 IP 地址

python:通过网络发送列表/字典

c# - 是否使用 "Optional, DefaultParameterValue"属性?

C# JavaScriptSerializer - 如何序列化为基本类型?

c# - 如何使用 autofac 注册两个 WCF 服务契约(Contract)