我们希望从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的有效负载?如果是这样,有什么方法可以找出多少?
答案 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'在您的机器上,并在数据通过网络时检查数据。
我希望这能让你走上正确的道路......