2010-11-18 15 views
7

WCF経由でSilverlightクライアントに送信する必要があるデータ転送オブジェクトがたくさんあるコレクションがあります。私はデフォルトのDataContractSerializerとHTTPSチャンネルを使用しています。WCF - GUIDを効率的に送信する方法(文字列ではない)

ここでは、DTOの1つのタイプの例を示します。

[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

を選択すると信じている:それはDataContractSeriのように見える

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

alizerはバイト配列をBase64エンコードで処理しますが、Guidの場合はGuid.ToStringメソッドを使用するように見えます。

1

これが私が知っていることから克服できる方法はありません。ガイドはすべての言語で普遍的に理解されているわけではありません。したがって、彼らは

あなたのサービス側の

は、文字列からGUIDに戻ってそれを変換し、あなたが、具体的システムを教えてくれない限り、それはそれ

var g = new Guid(string); 

の世話をする必要があり、より相互運用可能なフォーマット文字列にシリアライズされている何をそれはGUIDをシリアル化したい、私はそれがこれを試してみてください文字列

0

Guid値のプロパティからDataMember属性を削除し、代わりに新しい文字列値のDataMemberプロパティを追加して、必要なシリアライズされたフォームを表します。次に、プロパティのGuidフィールドのシリアライゼーションとデシリアライゼーションを実装し、&新しいプロパティのセットを取得します。

たとえば、16バイト表現をBase64でエンコードされた文字列としてシリアル化することができます。

関連する問題