2

一部のクラスをDataContractSerializationを使用するように変換して、出力にLinqエンティティを含めることができるようにします。その過程で、ある種の理論的な質問が頭に浮かびました。答えが「いいえ」であると確信している間、とにかく質問を投げかけると思いました。

オブジェクトを条件付きでシリアル化する方法はありますか?たとえば、顧客に情報を送信する目的でEmployeeオブジェクトをシリアル化する場合、アドレスを含めたくない場合があります。一方、その従業員を管理するサイトのWebサービスで使用するためにシリアル化する場合は、その情報が必要になる可能性があります。

別の可能性は、それらがシリアル化されているベースオブジェクトであるかどうかに基づいて特定のメンバーをシリアル化することです。したがって、ロケーションを含むチケットクラスがあり、ロケーションに連絡先のリストが含まれている場合、チケットをシリアル化する場合、その連絡先リストはおそらく必要ありません。しかし、私がロケーション自体を操作しようとしているのであれば、それは良いことかもしれません。

それで、それについて何か考えはありますか?

4

2 に答える 2

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();
    }
}
于 2009-04-06T17:36:07.237 に答える
0

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

于 2009-04-07T00:29:53.543 に答える