Tipps und Tricks rund um .NET und Visual Studio

WCF Bandbreite sparen mit EmitDefaultValuefalse
Kommentare

WCF serialisiert in der Standardeinstellung alle Mitglieder einer Datenklasse, auch wenn diese Null sind oder den Standardwert beinhalten. Auf diese Weise können Nachrichten lang werden.

Listing 1 zeigt eine serialisierte Instanz der Datenklasse Kunde, bei der nur zwei der zehn Attribute mit Werten gefüllt waren. Immerhin 769 Bytes gehen über die Leitung.

Listing 1

  
    
      
        
          
          0001-01-01T00:00:00
          00000000-0000-0000-0000-000000000000
          1233
          
          0
          dotnet Magazin
          
          
          0
          
          
        
      
    
  

  

Deutlich prägnanter wird es in diesem Fall, wenn man EmitDefaultValue = false verwendet, das ein Attribut der Annotation DataMember ist. Voraussetzung ist also, dass man mit expliziten Datenverträgen (DataContract) arbeitet und nicht mit dem „alten“ Serializable oder gar nicht annotierten POCO-Klassen. Seit .NET 3.5 Service Pack 1 kann WCF auch Klassen serialisieren, die weder mit DataContract noch mit Serializable annotiert sind. Listing 2 zeigt die mit DataMember(EmitDefaultValue = false) ausgestattete Klasse.

Listing 2
[DataContract]
 public class Kunde
 {
  [DataMember(EmitDefaultValue = false)]
  public int ID { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public string Name { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public string Ort { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public string Strasse { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public string Land { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public string Galaxie { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public DateTime Gründung { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public Uri Website { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public Version Version { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public long Mitarbeiteranzahl { get; set; }
  [DataMember(EmitDefaultValue = false)]
  public double Umsatz { get; set; }
 
  [DataMember(EmitDefaultValue = false)]
  public Guid Guid { get; set; }
 }
  

Das Serialsierungsergebnis ist deutlich kleiner (404 Bytes). Nicht nur der absolute, auch der relative Vorteil vergrößert sich, wenn man nicht nur ein Objekt, sondern viele überträgt, da dann der Overhead von SOAP nicht mehr so ins Gewicht fällt (Listing 3).

Listing 3

  
    
      
        
          1233
          dotnet Magazin
        
      
    
  

  
Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer arbeiten bei http://www.IT-Visions.de als Softwarearchitekten, Berater und Trainer für .NET-Technologien. Dabei unterstützen sie zahlreiche Unternehmen beim Einsatz von .NET und entwickeln selbst in größeren Projekten. Sie haben zahlreiche Fachbücher geschrieben und gehören seit vielen Jahren zu den Hauptsprechern auf der BASTA. Manfred Steyer ist zudem verantwortlich für den Fachbereich „Software Engineering“ der Studienrichtung „IT und Wirtschaftsinformatik“ an der FH CAMPUS 02 in Graz. Dr. Holger Schwichtenberg unterrichtet in Lehraufträgen an den Fachhochschulen Münster und Graz.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -