通过WCF发送类时,空属性是否会占用带宽?

时间:2016-12-28 14:26:24

标签: c# wcf

我们希望从WCF服务中发送两个对象集合。这两个对象的类共享一些共同的属性,每个属性都有其他属性,对它们来说是独一无二的......

public class TypeA {
  public string A { get; set; }
  public string B { get; set; }
  public string C { get; set; }
  public string D { get; set; }
}

public class TypeB {
  public string A { get; set; }
  public string B { get; set; }
  public string E { get; set; }
  public string F { get; set; }
}
  

是的我可以/应该使用公共基类,但这不是问题

一方面,有两个这样的类意味着每个类只有它需要的属性,这使它保持苗条和专注。另一方面,由于这些基本上是同一个底层对象的两个不同视图,因此将它们组合起来是完全合理的,只需填充所需的属性。

我无法找到一种方法来查看WCF有效负载的大小,因此不知道使用一个公共类是否会比使用特定类消耗更多带宽。我需要尽可能高效。

任何人都知道使用一个公共类是否会增加WCF的有效负载?如果是这样,有什么方法可以找出多少?

2 个答案:

答案 0 :(得分:1)

您可以在服务上放置XmlSerializerFormat属性,以便在发送对象时强制WCF使用ASP.NET序列化引擎。这将允许您使用其他属性和方法来完全控制序列化哪些属性。

然后,您可以使用两种方法限制属性的序列化: 1.实现ShouldSerializeXXXX()方法 2.使用DefaultValue属性。已经具有默认值的属性未被序列化。

示例:

[XmlSerializerFormat, ServiceContract]
public interface IMyService
{
    [OperationContract]
    MyData GetData();
}

[DataContract]
public class MyData
{
    [XmlAttribute, DataMember]
    public int Value1 { get; set; }

    // Explicit method to control serialization of Value1 property
    public bool ShouldSerializeValue1()
    {
        // do not serialize this value if it's 0
        return Value1 != 0;
    }

    // Use default value of 0 to prevent serializing zeros
    [XmlAttribute, DataMember, DefaultValue(0)]
    public int Value2 { get; set; }
}

答案 1 :(得分:1)

如果您担心数据包大小,我会更关心您使用的数据传输类型。例如,如果您正在使用SOAP协议,那么您的数据包大小将非常大,而不是担心对象的基类,您可以通过切换到二进制甚至JSON来极大地缩小数据包大小。请参阅此处以供参考:https://dzone.com/articles/wcf-rest-xml-json-or-both

另外,为了检查真正的数据包大小,我会安装' fiddler'在您的机器上,并在数据通过网络时检查数据。

我希望这能让你走上正确的道路......