2010-11-18 6 views
7

Ich habe eine Sammlung mit einer Menge von Datenübertragungsobjekten, die ich über WCF an einen Silverlight-Client senden muss. Ich verwende den Standard-DataContractSerializer und einen HTTPS-Kanal.WCF - So senden Sie GUIDs effizient (nicht als Zeichenfolgen)

Hier ist ein Beispiel für eine Art von DTO.

[DataContract(Namespace = Constants.OrgStructureNamespace)] 
public class EntityInfo : IExtensibleDataObject 
{ 
    [DataMember] public Guid EntityID { get; set; } 
    [DataMember] public EntityType EntityType { get; set; } 
    [DataMember] public IList<Guid> EntityVersions { get; set; } 
    [DataMember] public IList<Guid> OrganisationStructures { get; set; } 

    #region IExtensibleDataObject Members 
    ... 
    #endregion 
} 

Die Domäneneinheiten auf der Serverseite verwenden GUIDs als Primärschlüssel. Diese werden zu Strings serialisiert, die 36 Bytes lang sind. Eine GUID in binärer Form sollte nur 16 Bytes lang sein.

Gibt es einen Trick, um den DataContractSerializer serialisieren meine GUIDs als binär anstatt als die ausführlichen Strings, um die Leistung zu erhöhen?

Antwort

3

Versuchen sie, diese wählen:

[DataContract(Namespace = Constants.OrgStructureNamespace)] 
public class EntityInfo : IExtensibleDataObject 
{ 
    public Guid EntityID { get; set; } 

    [DataMember(Name="EntityID")] 
    byte[] EntityIDBytes 
    { 
     get { return this.EntityID.ToByteArray(); } 
     set { this.EntityID = new Guid(value); } 
    } 

    [DataMember] 
    public EntityType EntityType { get; set; } 
    [DataMember] 
    public IList<Guid> EntityVersions { get; set; } 
    [DataMember] 
    public IList<Guid> OrganisationStructures { get; set; } 

    #region IExtensibleDataObject Members 
    // ... 
    #endregion 
} 

es sieht aus wie die DataContractSeri Alizer behandelt Bytearrays durch Base64, die sie codieren, während es scheinbar nur die Guid.ToString-Methode für Guids verwendet.

1

Es gibt keine Möglichkeit, dass dies aus dem, was ich weiß, überwunden werden kann. Guides werden nicht von allen Sprachen allgemein verstanden. Deshalb werden sie in ein interoperables Format serialisiert, string

auf Ihrer Serviceseite wandelt es wieder in einem aus einem String guid und das sollte es

kümmern
var g = new Guid(string); 

, wenn Sie speziell dem System sagen, was Sie wollen sie die guid serialisiert wird dann ich glaube, es Zeichenfolge

0

Zum Entfernen des DataMember-Attributs aus Ihrer Guid-bewerteten Eigenschaft und zum Hinzufügen einer neuen string-wertigen DataMember-Eigenschaft zur Darstellung der gewünschten serialisierten Form. Implementieren Sie anschließend die Serialisierung und Deserialisierung des Guid-Felds in der Eigenschaft get & der neuen Eigenschaft.

Zum Beispiel könnten Sie Ihre 16-Byte-Darstellung als eine Base64-codierte Zeichenfolge serialisieren.

Verwandte Themen