2010-11-18 17 views
7

Tengo una colección que contiene MUCHOS Objetos de Transferencia de Datos que necesito enviar a un cliente de Silverlight sobre WCF. Estoy usando el DataContractSerializer predeterminado y un canal HTTPS.WCF - Cómo enviar GUID de manera eficiente (no como cadenas)

Aquí hay un ejemplo de un tipo de 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 
} 

Las entidades de dominio en el lado del servidor usan GUID como claves principales. Estos se serializan en cadenas que tienen 36 bytes de longitud. Un GUID en formato binario solo debe tener 16 bytes de longitud.

¿Hay algún truco para hacer que DataContractSerializer serialice mis GUID como binarios en lugar de serializarlos para aumentar el rendimiento?

Respuesta

3

Prueba esto:

[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 
} 

parece que la DataContractSeri Alizer maneja las matrices de bytes mediante codificación Base64, mientras que parece que solo usa el método Guid.ToString para Guids.

1

No hay forma de que esto se pueda superar por lo que sé. Las guías no son universalmente entendidas por todos los idiomas. Por lo tanto, son serializados en un formato más interoperable, cadena

en el lado del servicio convertirlo de nuevo en un GUID de una cadena y que debe cuidar de él

var g = new Guid(string); 

a menos que se diga específicamente el sistema lo que quiere que serializar el GUID es entonces yo creo que va a elegir cadena

0

¿Qué le parece eliminar el atributo DataMember de su propiedad Guid-valued y agregar una nueva propiedad DataMember con valor de cadena para representar el formulario serializado que desee. A continuación, implemente la serialización y la deserialización del campo Guid en la propiedad Obtenga & conjunto de la nueva propiedad.

Por ejemplo, puede serializar su representación de 16 bytes como una cadena codificada en Base64.

Cuestiones relacionadas