WCF – 如何有效地发送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 EntityVersions { get; set; } [DataMember] public IList OrganisationStructures { get; set; } #region IExtensibleDataObject Members ... #endregion } 

服务器端的域实体使用GUID作为主键。 这些序列化为36字节长的字符串。 二进制forms的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 EntityVersions { get; set; } [DataMember] public IList OrganisationStructures { get; set; } #region IExtensibleDataObject Members // ... #endregion } 

看起来DataContractSerializer通过Base64对它们进行编码来处理字节数组,而它似乎只是为Guids使用Guid.ToString方法。

我不知道这可以克服这个问题。 所有语言都不普遍理解指导。 因此,它们被序列化为更具互操作性的格式,字符串

在你的服务端将它从字符串转换回guid,它应该照顾它

 var g = new Guid(string); 

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

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

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