7 Stimmen

WCF - Wie man GUIDs effizient sendet (nicht als Strings)

Ich habe eine Sammlung mit vielen Datenübertragungsobjekten, die ich über WCF an einen Silverlight-Client senden muss. Ich verwende den Standard DataContractSerializer und einen HTTPS-Kanal.

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änenentitäten 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 Byte lang sein.

Gibt es einen Trick, damit der DataContractSerializer meine GUIDs als Binärdatei und nicht als ausführliche Zeichenfolgen serialisiert, um die Leistung zu erhöhen?

3voto

Dr. Wily's Apprentice Punkte 9952

Versuchen Sie dies:

[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 so aus, als ob der DataContractSerializer Byte-Arrays durch Base64-Kodierung behandelt, während es scheint, nur die Guid.ToString-Methode für Guids zu verwenden.

1voto

stack72 Punkte 8070

Soweit ich weiß, gibt es keine Möglichkeit, dies zu überwinden. Leitfäden werden nicht von allen Sprachen verstanden. Daher werden sie in ein interoperableres Format, String, serialisiert

auf Ihrer Dienstseite konvertieren Sie es von einer Zeichenkette zurück in eine guid und das sollte genügen

var g = new Guid(string);

es sei denn, Sie sagen dem System ausdrücklich, was Sie wollen, dass es die Guid serialisiert, dann glaube ich, dass es String wählen wird

0voto

Chris Dickson Punkte 11634

Wie wäre es, wenn Sie das DataMember-Attribut aus Ihrer Guid-bewerteten Eigenschaft entfernen und stattdessen eine neue String-bewertete DataMember-Eigenschaft hinzufügen, um die gewünschte serialisierte Form darzustellen. Dann implementieren Sie die Serialisierung und Deserialisierung des Guid-Feldes in der Eigenschaft get & set der neuen Eigenschaft.

Sie könnten zum Beispiel Ihre 16-Byte-Darstellung als Base64-kodierte Zeichenfolge serialisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X