WCF - Как эффективно отправлять GUID (не в виде строк) - PullRequest
7 голосов
/ 19 ноября 2010

У меня есть коллекция, содержащая много объектов передачи данных, которые мне нужно отправить клиенту Silverlight через WCF.Я использую DataContractSerializer по умолчанию и канал HTTPS.

Вот пример одного типа 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
}

Доменные объекты на стороне сервера используют GUID в качестве первичных ключей.Они сериализуются в строки длиной 36 байтов.GUID в двоичном виде должен иметь длину всего 16 байт.

Есть ли хитрость, чтобы DataContractSerializer сериализировал мои GUID как двоичные, а не как подробные строки для повышения производительности?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

Попробуйте это:

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

Похоже, что DataContractSerializer обрабатывает байтовые массивы путем их кодирования Base64, тогда как, похоже, он просто использует метод Guid.ToString для Guids.

1 голос
/ 19 ноября 2010

Нет никакого способа, которым это можно преодолеть из того, что я знаю.Руководства не всегда понятны всем языкам.Поэтому они сериализуются в более совместимый формат, строка

на вашей стороне службы преобразует его обратно в guid из строки, и это должно заботиться об этом

var g = new Guid(string);

, если вы не укажете специальносистема, что вы хотите, чтобы сериализовать guid, то я считаю, что он выберет строку

0 голосов
/ 19 ноября 2010

Как насчет удаления атрибута DataMember из свойства Guid-value и добавления вместо него нового свойства DataMember со строковым значением для представления любой сериализованной формы, которую вы хотите. Затем реализуйте сериализацию и десериализацию поля Guid в свойстве get & set нового свойства.

Например, вы можете сериализовать 16-байтовое представление в виде строки в кодировке Base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...