WCF DataContractSerializer具有长属性名称的性能

时间:2014-10-23 07:58:14

标签: c# wcf serialization datacontractserializer

我正在通过WCF传输大块数据,我正在尝试优化发送的结果。我已经从NetDataContactSerializer切换到DataContractSerializer,但由于它不再被序列化为XML,我想知道到底发生了什么。

例如,假设我将以下内容的集合(100,000条记录)序列化为XML:

public class SomeDataObject
{
    public string AnExcessivelyLongPropertyNameJustToIllustrateMyPoint { get; set; }
}

它看起来像这样:

<a:SomeDataObject>
    <b:AnExcessivelyLongPropertyNameJustToIllustrateMyPoint>
        ABC
    </b:AnExcessivelyLongPropertyNameJustToIllustrateMyPoint>
</a:SomeDataObject>

现在,从上面可以看出,对于成千上万条记录来说,将属性命名为其他内容会有显着的性能提升,例如:

<a:SomeDataObject>
    <b:NormalName>ABC</b:NormalName>
</a:SomeDataObject>

我的问题是:当使用netTcp绑定和默认的DataContactSerializer时,它是否足够智能,不能实际重复被序列化的属性的名称?

或者,如果您不知道答案,是否有一种简单的方法可以衡量这一点?

1 个答案:

答案 0 :(得分:2)

要使WPF序列化具有较小的XML,请在Name属性中添加短名称,如:

[DataContract(Name="sdo")]
public class SomeDataObject
{
    [DataMember(Name = "axlpnjtimp")]
    public string AnExcessivelyLongPropertyNameJustToIllustrateMyPoint { get; set; }
}

对于手动XML序列化,使用XmlSerializer为类添加属性[XmlType(TypeName = "x")],为属性添加[XmlElement("y")]

在你的情况下,我会这样:

[XmlType(TypeName = "sdo")]
public class SomeDataObject
{
    [XmlElement("axlpnjtimp")]
    public string AnExcessivelyLongPropertyNameJustToIllustrateMyPoint { get; set; }
}

序列化xml:

<?xml version="1.0" encoding="utf-16"?>
<sdo>
  <axlpnjtimp>Property Name</axlpnjtimp>
</sdo>

它将大大减少发送数据的大小。