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

时间:2010-11-18 22:13:53

标签: c# wcf

我有一个包含大量数据传输对象的集合,我需要通过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序列化为二进制而不是冗长的字符串以提高性能?

3 个答案:

答案 0 :(得分:3)

试试这个:

[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使用Guid.ToString方法。

答案 1 :(得分:1)

我无法从我所知道的方面克服这一点。所有语言都不普遍理解指导。因此,它们被序列化为更具互操作性的格式,字符串

服务端的

将其从字符串转换回guid并且应该处理它

var g = new Guid(string);

除非你明确告诉系统你想要它序列化guid是什么然后我相信它会选择字符串

答案 2 :(得分:0)

如何从Guid-valued属性中删除DataMember属性,并添加一个新的字符串值DataMember属性来表示您想要的任何序列化表单。然后在属性get&amp; amp;中实现Guid字段的序列化和反序列化。一套新房产。

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