如何有效地发送GUID(而不是字符串)

我有一个包含很多数据传输对象的集合,我需要通过WCF发送到Silverlight客户端。 我正在使用默认的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序列化为二进制而不是冗长的字符串以提高性能?


尝试这个:

[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方法来处理Guid。


从我所知道的事情来看,这是无法克服的。 Guids没有被所有语言普遍理解。 因此,它们被序列化为更具互操作性的格式,字符串

在你的服务端将其转换回来一个字符串guid,并应该照顾它

var g = new Guid(string);

除非你明确地告诉系统你想要它序列化的GUID然后我相信它会选择字符串


如何从Guid-valued属性中删除DataMember属性,并添加一个新的字符串值的DataMember属性来表示所需的任何序列化表单。 然后在属性获取和设置新属性中实现Guid字段的序列化和反序列化。

例如,您可能会将您的16字节表示形式序列化为Base64编码的字符串。

链接地址: http://www.djcxy.com/p/48841.html

上一篇: How to send GUIDs efficiently (not as strings)

下一篇: Number of Results