2009-04-06 15 views
2

私は、出力にLinqエンティティを含めることができるように、私のクラスのいくつかをDataContractSerializationを使用するように変換しています。私が処理中に私の頭の中に一種の理論的な疑問が浮かびました。答えが「いいえ」と賭けている間に、とにかく疑問を投げかけてしまいました。DataContractSerializerでシリアル化を条件付きで制御できますか?

オブジェクトを条件付きでシリアル化する方法はありますか?たとえば、顧客に情報を送信する意図でEmployeeオブジェクトをシリアライズする場合、そのアドレスを含めることは望ましくないかもしれません。一方、その従業員を管理するサイトのWebサービスで使用するようシリアル化している場合、その情報が必要になることがあります。

もう1つの可能性は、それらがシリアル化されている基本オブジェクトであるかどうかに基づいて特定のメンバーをシリアル化することです。だから私はLocationを含むTicketクラスがあり、LocationにContactsのリストが含まれていれば、Ticketをシリアライズしていればその連絡先リストを望んでいないでしょう。しかし、もし私が場所そのものと一緒に仕事をしようとしていたら、それは良いことかもしれません。

だからそれについての考えはありますか?

答えて

0

私はまだWCFを使用していませんが、.NET(属性ベース)の標準シリアル化では、OnSerializingメソッドとOnDeserializedメソッドをクラスに持たせることができます。多分WCFは何か類似したものを提供していますか?これらのメソッドの中では、条件付きでデータを削除することができます(ただし、オブジェクトが変更されたことを念頭に置いていますが、シリアル化のかなり厄介な副作用です)。

例:

public class Employee 
{ 
    public Address HomeAddress { get; set; } 

    [OnSerializing] 
    private void RemoveAddress(StreamingContext context) 
    { 
     if (1 == 1) // replace with your condition 
      HomeAddress = null; 
    } 

    [OnDeserialized] 
    private void PutAddressBack(StreamingContext context) 
    { 
     if (1 == 1) 
      HomeAddress = LoadHomeAddressFromBackingStore(); 
    } 
} 
0

私が直接WebサービスからSQLまたはADO.NET Entity FrameworkのオブジェクトにLINQを返すに対してお勧めします。残念ながら、これは実装の詳細をシリアライズします。たとえば、バックリンクと同様に、基本クラスのフィールドもシリアル化されています。

関連する問題