【问题标题】:WCF - How to send GUIDs efficiently (not as strings)WCF - 如何有效地发送 GUID(而不是作为字符串)
【发布时间】:2010-11-18 22:13:53
【问题描述】:

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

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    试试这个:

    [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 方法。

    【讨论】:

      【解决方案2】:

      据我所知,这是无法克服的。并非所有语言都能普遍理解指南。因此它们被序列化为更可互操作的格式,字符串

      在您的服务端将其从字符串转换回 guid 并且应该处理它

      var g = new Guid(string);
      

      除非你明确告诉系统你希望它序列化 guid 是什么,否则我相信它会选择字符串

      【讨论】:

        【解决方案3】:

        如何从您的 Guid 值属性中删除 DataMember 属性,然后添加一个新的字符串值 DataMember 属性来表示您想要的任何序列化形式。然后在新属性的属性get&set中实现Guid字段的序列化和反序列化。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 2017-07-16
          • 2021-11-30
          • 2014-07-14
          • 2017-09-22
          相关资源
          最近更新 更多